LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgUnVudGltZSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJUnVudGltZSB7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JVTlRJTUVfVFlQRV9JRCA9ICJydW50aW1lLXR5cGUtaWQiOwoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0NBVElPTiA9ICJsb2NhdGlvbiI7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RFU1RfRU5WSVJPTk1FTlQgPSAidGVzdC1lbnZpcm9ubWVudCI7Cglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NUVUIgPSAic3R1YiI7CgoJcHJvdGVjdGVkIElSdW50aW1lVHlwZSBydW50aW1lVHlwZTsKCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgZGVsZWdhdGU7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcnVudGltZS4KCSAqIAoJICogQHBhcmFtIGZpbGUKCSAqLwoJcHVibGljIFJ1bnRpbWUoSUZpbGUgZmlsZSkgewoJCXN1cGVyKGZpbGUpOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUuCgkgKiAKCSAqIEBwYXJhbSBmaWxlCgkgKiBAcGFyYW0gaWQKCSAqIEBwYXJhbSBydW50aW1lVHlwZQoJICovCglwdWJsaWMgUnVudGltZShJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewoJCXN1cGVyKGZpbGUsIGlkKTsKCQl0aGlzLnJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGU7CgkJbWFwLnB1dChQUk9QX05BTUUsIHJ1bnRpbWVUeXBlLmdldE5hbWUoKSk7Cgl9CgoJLyoqCgkgKiBAc2VlIElSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCkKCSAqLwoJcHVibGljIElSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpIHsKCQlyZXR1cm4gcnVudGltZVR5cGU7Cgl9CgoJLyoqCgkgKiBAc2VlIElSdW50aW1lI3ZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IpCgkgKi8KCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCXRyeSB7CgkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS52YWxpZGF0ZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgdmFsaWRhdGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCglwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIGdldERlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCWlmIChkZWxlZ2F0ZSAhPSBudWxsKQoJCQlyZXR1cm4gZGVsZWdhdGU7CgkJCgkJc3luY2hyb25pemVkICh0aGlzKSB7CgkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCQkJCVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlMiA9IChSdW50aW1lVHlwZSkgcnVudGltZVR5cGU7CgkJCQkJZGVsZWdhdGUgPSAoUnVudGltZURlbGVnYXRlKSBydW50aW1lVHlwZTIuZ2V0RWxlbWVudCgpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlJ1bnRpbWUuZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwoJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZGVsZWdhdGU7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgYmVlbiBsb2FkZWQuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlbGVnYXRlIGhhcyBiZWVuIGxvYWRlZCwgYW5kCgkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVMb2FkZWQoKSB7CgkJcmV0dXJuIGRlbGVnYXRlICE9IG51bGw7Cgl9CgkKCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CgkJaWYgKGRlbGVnYXRlICE9IG51bGwpCgkJCWRlbGVnYXRlLmRpc3Bvc2UoKTsKCX0KCQoJLyoqCgkgKiBAc2VlIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCkKCSAqLwoJcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7CgkJcmV0dXJuIG5ldyBSdW50aW1lV29ya2luZ0NvcHkodGhpcyk7IAoJfQoKCS8qKgoJICogQHNlZSBJUnVudGltZSNpc1dvcmtpbmdDb3B5KCkKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBAc2VlIElSdW50aW1lI2dldExvY2F0aW9uKCkKCSAqLwoJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewoJCVN0cmluZyB0ZW1wID0gZ2V0QXR0cmlidXRlKFBST1BfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7CgkJaWYgKHRlbXAgPT0gbnVsbCkKCQkJcmV0dXJuIG51bGw7CgkJcmV0dXJuIG5ldyBQYXRoKHRlbXApOwoJfQoJCglwcm90ZWN0ZWQgdm9pZCBkZWxldGVGcm9tTWV0YWRhdGEoKSB7CgkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUnVudGltZSh0aGlzKTsKCX0KCglwcm90ZWN0ZWQgdm9pZCBzYXZlVG9NZXRhZGF0YShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlzdXBlci5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKCQlSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSdW50aW1lKHRoaXMpOwoJfQoKCXByb3RlY3RlZCBTdHJpbmcgZ2V0WE1MUm9vdCgpIHsKCQlyZXR1cm4gInJ1bnRpbWUiOwoJfQoKCXB1YmxpYyBib29sZWFuIGlzVGVzdEVudmlyb25tZW50KCkgewoJCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBmYWxzZSk7Cgl9CgoJLyoqCgkgKiBAc2VlIElSdW50aW1lI2lzU3R1YigpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzU3R1YigpIHsKCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfU1RVQiwgZmFsc2UpOwoJfQoKCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsKFJ1bnRpbWVXb3JraW5nQ29weSB3YykgewoJCW1hcCA9IHdjLm1hcDsKCQlydW50aW1lVHlwZSA9IHdjLnJ1bnRpbWVUeXBlOwoJCWZpbGUgPSB3Yy5maWxlOwoJCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7CgkJCgkJaW50IHRpbWVzdGFtcCA9IHdjLmdldFRpbWVzdGFtcCgpOwoJCW1hcC5wdXQoInRpbWVzdGFtcCIsIEludGVnZXIudG9TdHJpbmcodGltZXN0YW1wKzEpKTsKCX0KCglwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewoJCVN0cmluZyBydW50aW1lVHlwZUlkID0gbWVtZW50by5nZXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQpOwoJCWlmIChydW50aW1lVHlwZUlkICE9IG51bGwpCgkJCXJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVJZCk7CgkJZWxzZQoJCQlydW50aW1lVHlwZSA9IG51bGw7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCkKCQkJbWVtZW50by5wdXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQsIHJ1bnRpbWVUeXBlLmdldElkKCkpOwoJfQoKCS8qKgoJICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKCSAqLwoJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKCQlpZiAoIShvYmogaW5zdGFuY2VvZiBSdW50aW1lKSkKCQkJcmV0dXJuIGZhbHNlOwoJCQoJCVJ1bnRpbWUgcnVudGltZSA9IChSdW50aW1lKSBvYmo7CgkJcmV0dXJuIHJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMoZ2V0SWQoKSk7Cgl9CgkKCS8qKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQoJICovCglwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewoJCVJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZTIgPSBnZXREZWxlZ2F0ZShudWxsKTsKCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlMikpCgkJCXJldHVybiBkZWxlZ2F0ZTsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIlJ1bnRpbWVbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldExvY2F0aW9uKCkgKyAiLCAiICsgZ2V0UnVudGltZVR5cGUoKSArICJdIjsKCX0KfQ==