LyoqCiAqIFBlcmZTZXJ2aWNlX1NlcnZpY2VUZXN0Q2FzZS5qYXZhCiAqCiAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCiAqIGJ5IHRoZSBBcGFjaGUgQXhpcyAxLjJiZXRhIEFwciAyNSwgMjAwNCAoMTE6MTk6MTYgRURUKSBXU0RMMkphdmEgZW1pdHRlci4KICovCgpwYWNrYWdlIHNhbXBsZXMucGVyZjsKCmltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLmxvZ2dlci5Mb2dGYWN0b3J5OwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwoKcHVibGljIGNsYXNzIFBlcmZTZXJ2aWNlX1NlcnZpY2VUZXN0Q2FzZSBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7CiAgICAvKiogRmllbGQgbG9nICovCiAgICBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBlcmZTZXJ2aWNlX1NlcnZpY2VUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCkpOwoKICAgIHB1YmxpYyBQZXJmU2VydmljZV9TZXJ2aWNlVGVzdENhc2UoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7CiAgICAgICAgc3VwZXIobmFtZSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdDFQZXJmUG9ydEhhbmRsZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgc2FtcGxlcy5wZXJmLlBlcmZQb3J0U29hcEJpbmRpbmdTdHViIGJpbmRpbmc7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYmluZGluZyA9IChzYW1wbGVzLnBlcmYuUGVyZlBvcnRTb2FwQmluZGluZ1N0dWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHNhbXBsZXMucGVyZi5QZXJmU2VydmljZV9TZXJ2aWNlTG9jYXRvcigpLmdldFBlcmZQb3J0KCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChqYXZheC54bWwucnBjLlNlcnZpY2VFeGNlcHRpb24ganJlKSB7CiAgICAgICAgICAgIGlmKGpyZS5nZXRMaW5rZWRDYXVzZSgpIT1udWxsKQogICAgICAgICAgICAgICAganJlLmdldExpbmtlZENhdXNlKCkucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIHRocm93IG5ldyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkpBWC1SUEMgU2VydmljZUV4Y2VwdGlvbiBjYXVnaHQ6ICIgKyBqcmUpOwogICAgICAgIH0KICAgICAgICBhc3NlcnROb3ROdWxsKCJiaW5kaW5nIGlzIG51bGwiLCBiaW5kaW5nKTsKCiAgICAgICAgLy8gVGltZSBvdXQgYWZ0ZXIgYSBtaW51dGUKICAgICAgICBiaW5kaW5nLnNldFRpbWVvdXQoNjAwMDApOwogICAgICAgIGJpbmRpbmcuX3NldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuQ2FsbC5TVFJFQU1JTkdfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7CiAgICAgICAgLy8gVGltZSBvdXQgYWZ0ZXIgYSBtaW51dGUKICAgICAgICBiaW5kaW5nLnNldFRpbWVvdXQoNjAwMDApOwoKICAgICAgICBsb2cuaW5mbygiPj4+PiBXYXJtaW5nIHVwLi4uIik7CiAgICAgICAgcHVtcChiaW5kaW5nLCAxKTsKICAgICAgICBsb2cuaW5mbygiPj4+PiBSdW5uaW5nIHZvbHVtZSB0ZXN0cy4uLiIpOwogICAgICAgIHB1bXAoYmluZGluZywgMTAwKTsKICAgICAgICBwdW1wKGJpbmRpbmcsIDEwMDApOwogICAgICAgIHB1bXAoYmluZGluZywgMTAwMDApOwogICAgICAgIHB1bXAoYmluZGluZywgMTAwMDAwKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1bXAoUGVyZlBvcnRTb2FwQmluZGluZ1N0dWIgYmluZGluZywgaW50IGNvdW50KQogICAgICAgICAgICB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tjb3VudF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHNbaV0gPSAicXdlcnR5dWlvcOVhc2RmZ2hqa2z25Hp4Y3Zibm0iOwogICAgICAgIH0KICAgICAgICBEYXRlIHN0YXJ0ID0gbmV3IERhdGUoKTsKICAgICAgICBTdHJpbmcgdmFsdWUgPSBiaW5kaW5nLmhhbmRsZVN0cmluZ0FycmF5KHMpOwogICAgICAgIERhdGUgZW5kID0gbmV3IERhdGUoKTsKCiAgICAgICAgbG9nLmluZm8oIkNvdW50OiIgKyBjb3VudCArICIgXHRUaW1lIGNvbnN1bWVkOiAiICsKICAgICAgICAgICAgICAgIChlbmQuZ2V0VGltZSgpIC0gc3RhcnQuZ2V0VGltZSgpKSArICJcdFJldHVybjoiICsgdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFBlcmZTZXJ2aWNlX1NlcnZpY2VUZXN0Q2FzZSB0ZXN0cyA9IG5ldyBQZXJmU2VydmljZV9TZXJ2aWNlVGVzdENhc2UoIlBlcmYiKTsKICAgICAgICB0ZXN0cy50ZXN0MVBlcmZQb3J0SGFuZGxlU3RyaW5nQXJyYXkoKTsKICAgIH0KfQo=