LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBJQk0gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICogJElkOiBBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLmphdmEsdiAxLjggMjAwNS8wNi8xNSAyMDowNjowMSBraHVzc2V5IEV4cCAkCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnVtbDI7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKCi8qKgogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGQgU3RydWN0dXJhbCBGZWF0dXJlIFZhbHVlIEFjdGlvbjwvYj48L2VtPicuCiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogKgogKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICogU3RydWN0dXJhbCBGZWF0dXJlcyBhcmUgcG90ZW50aWFsbHkgbXVsdGktdmFsdWVkIGFuZCBvcmRlcmVkLCBzbyB0aGUgYWN0aW9uIHN1cHBvcnRzIHNwZWNpZmljYXRpb24gb2YgaW5zZXJ0aW9uIHBvaW50cyBmb3IgbmV3IHZhbHVlcy4gSXQgYWxzbyBzdXBwb3J0cyB0aGUgcmVtb3ZhbCBvZiBleGlzdGluZyB2YWx1ZXMgb2YgdGhlIHN0cnVjdHVyYWwgZmVhdHVyZSBiZWZvcmUgdGhlIG5ldyB2YWx1ZSBpcyBhZGRlZC4gVGhlIG9iamVjdCB0byBhY2Nlc3MgaXMgc3BlY2lmaWVkIGR5bmFtaWNhbGx5LCBieSByZWZlcnJpbmcgdG8gYW4gaW5wdXQgcGluIG9uIHdoaWNoIHRoZSBvYmplY3Qgd2lsbCBiZSBwbGFjZWQgYXQgcnVudGltZS4gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoaXMgcGluIGlzIHRoZSBjbGFzc2lmaWVyIHRoYXQgb3ducyB0aGUgc3BlY2lmaWVkIHN0cnVjdHVyYWwgZmVhdHVyZSwgYW5kIHRoZSB2YWx1ZZJzIG11bHRpcGxpY2l0eSBpcyAxLi4xLiAKICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogKgogKiA8cD4KICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogKiA8dWw+CiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS51bWwyLkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24jaXNSZXBsYWNlQWxsIDxlbT5JcyBSZXBsYWNlIEFsbDwvZW0+fTwvbGk+CiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS51bWwyLkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24jZ2V0SW5zZXJ0QXQgPGVtPkluc2VydCBBdDwvZW0+fTwvbGk+CiAqIDwvdWw+CiAqIDwvcD4KICoKICogQHNlZSBvcmcuZWNsaXBzZS51bWwyLlVNTDJQYWNrYWdlI2dldEFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24oKQogKiBAbW9kZWwKICogQGdlbmVyYXRlZAogKi8KcHVibGljIGludGVyZmFjZSBBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIGV4dGVuZHMgV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbnsKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIjsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUmVwbGFjZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgUmVwbGFjZSBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgoJICogPC9wPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIFNwZWNpZmllcyB3aGV0aGVyIGV4aXN0aW5nIHZhbHVlcyBvZiB0aGUgc3RydWN0dXJhbCBmZWF0dXJlIG9mIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIGFkZGluZyB0aGUgbmV3IHZhbHVlLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwbGFjZSBBbGw8L2VtPicgYXR0cmlidXRlLgoJICogQHNlZSAjc2V0SXNSZXBsYWNlQWxsKGJvb2xlYW4pCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnVtbDIuVU1MMlBhY2thZ2UjZ2V0QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9Jc1JlcGxhY2VBbGwoKQoJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi5Cb29sZWFuIgoJICogQGdlbmVyYXRlZAoJICovCglib29sZWFuIGlzUmVwbGFjZUFsbCgpOwoKCS8qKgoJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UudW1sMi5BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uI2lzUmVwbGFjZUFsbCA8ZW0+SXMgUmVwbGFjZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGxhY2UgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KCSAqIEBzZWUgI2lzUmVwbGFjZUFsbCgpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXZvaWQgc2V0SXNSZXBsYWNlQWxsKGJvb2xlYW4gdmFsdWUpOwoKCgkvKioKCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydCBBdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0IEF0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KCSAqIDwvcD4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiAoU3BlY2lhbGl6ZWQgZnJvbSBBY3Rpb246aW5wdXQpIEdpdmVzIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0byBpbnNlcnQgYSBuZXcgdmFsdWUgb3IgbW92ZSBhbiBleGlzdGluZyB2YWx1ZSBpbiBvcmRlcmVkIHN0cnVjdHVyYWwgZmVhdHVyZXMuIFRoZSB0eXBlIG9mIHRoZSBwaW4gaXMgVW5saW1pdGVkTmF0dXJhbCwgYnV0IHRoZSB2YWx1ZSBjYW5ub3QgYmUgemVyby4gVGhpcyBwaW4gaXMgb21pdHRlZCBmb3IgdW5vcmRlcmVkIHN0cnVjdHVyYWwgZmVhdHVyZXMuCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQgQXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgoJICogQHNlZSAjc2V0SW5zZXJ0QXQoSW5wdXRQaW4pCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnVtbDIuVU1MMlBhY2thZ2UjZ2V0QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9JbnNlcnRBdCgpCgkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUlucHV0UGluIGdldEluc2VydEF0KCk7CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS51bWwyLkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24jZ2V0SW5zZXJ0QXQgPGVtPkluc2VydCBBdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0IEF0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KCSAqIEBzZWUgI2dldEluc2VydEF0KCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJdm9pZCBzZXRJbnNlcnRBdChJbnB1dFBpbiB2YWx1ZSk7CgoKCS8qKgoJICogQ3JlYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS51bWwyLklucHV0UGlufSBhbmQgc2V0cyB0aGUgJzxlbT48Yj5JbnNlcnQgQXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBwYXJhbSBlQ2xhc3MgVGhlIEVjb3JlIGNsYXNzIG9mIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UudW1sMi5JbnB1dFBpbn0gdG8gY3JlYXRlLgoJICogQHJldHVybiBUaGUgbmV3IHtAbGluayBvcmcuZWNsaXBzZS51bWwyLklucHV0UGlufS4KCSAqIEBzZWUgI2dldEluc2VydEF0KCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwogICAgSW5wdXRQaW4gY3JlYXRlSW5zZXJ0QXQoRUNsYXNzIGVDbGFzcyk7CgoJLyoqCgkgKiBDcmVhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuSW5wdXRQaW59IGFuZCBzZXRzIHRoZSAnPGVtPjxiPkluc2VydCBBdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHJldHVybiBUaGUgbmV3IHtAbGluayBvcmcuZWNsaXBzZS51bWwyLklucHV0UGlufS4KCSAqIEBzZWUgI2dldEluc2VydEF0KCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwogICAgSW5wdXRQaW4gY3JlYXRlSW5zZXJ0QXQoKTsKCn0gLy8gQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbgo=