LyoKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEJvcmxhbmQgU29mdHdhcmUgQ29ycG9yYXRpb24KICogCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgRG1pdHJ5IFN0YWRuaWsgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgIEFsZXhhbmRlciBTaGF0YWxpbiAoQm9ybGFuZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICovCgqrSU1QT1JUICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA4L0dlbk1vZGVsIrsKCqtERUZJTkUgY29udHNydWN0b3IgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGUtuwoJq0VYUEFORCB4cHQ6OkNvbW1vbjo6Z2VuZXJhdGVkTWVtYmVyQ29tbWVudLsKCXB1YmxpYyCrZWRpdFBhcnRDbGFzc05hbWW7KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcgdmlldykgewoJCXN1cGVyKHZpZXcpOwoJfQqrRU5EREVGSU5FuwoKq0RFRklORSBnZXREcmFnVHJhY2tlckJvZHkgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGUtuwoJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuU2VsZWN0aW9uUmVxdWVzdCAmJiAoKG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5TZWxlY3Rpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMYXN0QnV0dG9uUHJlc3NlZCgpID09IDMpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4KHRoaXMpOwqrRU5EREVGSU5FuwoKq0RFRklORSBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzQm9keSBGT1IgZ21mZ2VuOjpHZW5DaGlsZExhYmVsTm9kZS27CglzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7CglpbnN0YWxsRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwgbmV3IKtnZXRJdGVtU2VtYW50aWNFZGl0UG9saWN5UXVhbGlmaWVkQ2xhc3NOYW1lKCm7KCkpOwoJaW5zdGFsbEVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsIG5ldyCrZ2V0RGlhZ3JhbSgpLmdldFRleHROb25SZXNpemFibGVFZGl0UG9saWN5UXVhbGlmaWVkQ2xhc3NOYW1lKCm7KCkpOwoJaW5zdGFsbEVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MaXN0SXRlbUNvbXBvbmVudEVkaXRQb2xpY3koKSk7CglpbnN0YWxsRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwoJq0VYUEFORCB4cHQ6OmRpYWdyYW06OmVkaXRwYXJ0czo6Q29tbW9uOjpiZWhhdmlvdXIgRk9SIHRoaXMtuwqrRU5EREVGSU5FuwoKq0RFRklORSBoYW5kbGVOb3RpZmljYXRpb25FdmVudEJvZHkgRk9SIGdtZmdlbjo6R2VuQ2hpbGRMYWJlbE5vZGUtuwoJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7CgmrRVhQQU5EIHhwdDo6ZGlhZ3JhbTo6ZWRpdHBhcnRzOjpDb21tb246OmhhbmRsZVRleHQgRk9SIHRoaXMtuwoJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwqrRU5EREVGSU5Fuw==