LyoNCiAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQogKg0KICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqDQogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KICogDQogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAqLw0KcGFja2FnZSBjb20ubW90b3JvbGFtb2JpbGl0eS5wcmVmbGlnaHRpbmcuY29yZS5wZXJtaXNzaW9uZmVhdHVyZTsNCg0KLyoqDQogKiBCZWFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRhdGEgaW5zaWRlIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBub2RlIGZyb20gQW5kcm9pZE1hbmlmZXN0LnhtbA0KICovDQpwdWJsaWMgY2xhc3MgUGVybWlzc2lvbg0Kew0KICAgIHByaXZhdGUgU3RyaW5nIGlkOw0KDQogICAgLyoqIA0KICAgICAqIENvbnN0cnVjdG9yIHdoaWNoIGFzc2lnbnMgdGhpcyB7QGxpbmsgUGVybWlzc2lvbn0gaWRlbnRpZmllci4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gaWQgVGhlIHZhbHVlIGluc2lkZSA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iIiZndDs8L2NvZGU+DQogICAgICovDQogICAgcHVibGljIFBlcm1pc3Npb24oU3RyaW5nIGlkKQ0KICAgIHsNCiAgICAgICAgdGhpcy5pZCA9IGlkOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldHMgdGhlIGlkIGFzIGluIHRoZSBub2RlIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSIiJmd0OzwvY29kZT4uDQogICAgICogDQogICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZCBhcyBpbiB0aGUgbm9kZSA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iIiZndDs8L2NvZGU+Lg0KICAgICAqLw0KICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIGlkOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIA0KICAgICAqICBTZXQgdGhlIGlkIGFzIGluIHRoZSBub2RlIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSIiJmd0OzwvY29kZT4uDQogICAgICogIA0KICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgYXMgaW4gdGhlIG5vZGUgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9IiImZ3Q7PC9jb2RlPi4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpDQogICAgew0KICAgICAgICB0aGlzLmlkID0gaWQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUHJpbnRzIG91dCB0aGUgSWQuDQogICAgICogDQogICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBJZC4NCiAgICAgKiANCiAgICAgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpDQogICAgICovDQogICAgQE92ZXJyaWRlDQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQogICAgew0KICAgICAgICByZXR1cm4gaWQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ3JlYXRlcyBhIGhhc2gtY29kZSBudW1iZXIgYmFzZWQgb24gdGhpcyBvYmplY3S0cyBJZC4NCiAgICAgKiANCiAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhc2gtY29kZSBiYXNlZCBvbiB0aGlzIG9iamVjdLRzIElkLg0KICAgICAqLw0KICAgIEBPdmVycmlkZQ0KICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KICAgIHsNCiAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7DQogICAgICAgIGludCByZXN1bHQgPSAxOw0KICAgICAgICByZXN1bHQgPSAocHJpbWUgKiByZXN1bHQpICsgKChpZCA9PSBudWxsKSA/IDAgOiBpZC5oYXNoQ29kZSgpKTsNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRydWUgd2hldGhlciB0aGUgY29tcGFyZWQgb2JqZWN0IGlzIGEge0BsaW5rIFBlcm1pc3Npb259DQogICAgICogYW5kIHRoZSBJZHMgYXJlIGVxdWFsLg0KICAgICAqIA0KICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGJlIGNvbXBhcmVkLiBpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQZXJtaXNzaW9ufS4NCiAgICAgKiANCiAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHtAbGluayBQZXJtaXNzaW9ufSBhcmUgZXF1YWwsDQogICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCiAgICAgKiANCiAgICAgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQ0KICAgICAqLw0KICAgIEBPdmVycmlkZQ0KICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAob2JqID09IG51bGwpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIFBlcm1pc3Npb24gb3RoZXIgPSAoUGVybWlzc2lvbikgb2JqOw0KICAgICAgICBpZiAoaWQgPT0gbnVsbCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKG90aGVyLmlkICE9IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCFpZC5lcXVhbHMob3RoZXIuaWQpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KfQ0K