cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCiAqLwpwdWJsaWMgY2xhc3MgVHJhY2UgewoJcHVibGljIHN0YXRpYyBieXRlIENPTkZJRyA9IDA7CglwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7CglwdWJsaWMgc3RhdGljIGJ5dGUgU0VWRVJFID0gMjsKCXB1YmxpYyBzdGF0aWMgYnl0ZSBGSU5FU1QgPSAzOwoJcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNDsKCQoJLyoqCgkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwcml2YXRlIFRyYWNlKCkgewoJCXN1cGVyKCk7Cgl9CgkKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCgkgKgoJICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKCQlUcmFjZS50cmFjZShsZXZlbCwgcywgbnVsbCk7Cgl9CgkKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KCSAqCgkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCgkgKiBAcGFyYW0gdCBqYXZhLmxhbmcuVGhyb3dhYmxlCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKCQlpZiAoIUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpCgkJCXJldHVybjsKCgkJU3lzdGVtLm91dC5wcmludGxuKHMpOwoJCWlmICh0ICE9IG51bGwpCgkJCXQucHJpbnRTdGFja1RyYWNlKCk7Cgl9CgkKCS8qKgoJICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCgkgKgoJICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHMpIHsKCQl0cmFjZShzLCBudWxsKTsKCX0KCQoJLyoqCgkgKiBUcmFjZSB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgoJICoKCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKCSAqIEBwYXJhbSBlIGphdmEubGFuZy5UaHJvd2FibGUKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewoJCXRyYWNlKEZJTkVTVCwgcywgdCk7Cgl9Cn0=