LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCkNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4NCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUNCndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbA0KoA0KQ29udHJpYnV0b3JzOg0KICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsNCg0KLyoqDQogKiBBIGNvbXBsZXRpb24gcmVxdWVzdG9yIGFjY2VwdHMgcmVzdWx0cyBhcyB0aGV5IGFyZSBjb21wdXRlZCBhbmQgaXMgYXdhcmUNCiAqIG9mIHNvdXJjZSBwb3NpdGlvbnMgdG8gY29tcGxldGUgdGhlIHZhcmlvdXMgZGlmZmVyZW50IHJlc3VsdHMuDQogKiA8cD4NCiAqIFRoaXMgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLg0KICogPC9wPg0KICoNCiAqIEBzZWUgSUNvZGVBc3Npc3QNCiAqIEBzaW5jZSAyLjANCiAqLw0KcHVibGljIGludGVyZmFjZSBJQ29tcGxldGlvblJlcXVlc3RvciB7DQovKioNCiAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhbiBhbm9ueW5vdXMgdHlwZSBkZWNsYXJhdGlvbiBjb21wbGV0aW9uLg0KICogQHBhcmFtIHN1cGVyVHlwZVBhY2thZ2VOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHN1cGVyIHR5cGUgb2YgdGh3IG5ldyBhbm9ueW5vdXMgdHlwZSBkZWNsYXJhdGlvbiAuDQogKiANCiAqIEBwYXJhbSBzdXBlclR5cGVOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSBzdXBlciB0eXBlIG9mIHRoaXMgbmV3IGFub255bm91cyB0eXBlIGRlY2xhcmF0aW9uLg0KICogDQogKiBAcGFyYW0gcGFyYW1ldGVyUGFja2FnZU5hbWVzIGNoYXJbXVtdDQogKiAJCU5hbWVzIG9mIHRoZSBwYWNrYWdlcyBpbiB3aGljaCB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBkZWNsYXJlZC4NCiAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclR5cGVOYW1lcy4NCiAqIA0KICogQHBhcmFtIHBhcmFtZXRlclR5cGVOYW1lcyBjaGFyW11bXQ0KICogCQlOYW1lcyBvZiB0aGUgcGFyYW1ldGVycyB0eXBlcy4NCiAqICAgIAlTaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHBhcmFtZXRlclBhY2thZ2VOYW1lcy4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIGNoYXJbXQ0KICogCQlUaGUgY29tcGxldGlvbiBmb3IgdGhlIGFub255bm91cyB0eXBlIGRlY2xhcmF0aW9uLg0KICogCQlDYW4gaW5jbHVkZSB6ZXJvLCBvbmUgb3IgdHdvIGJyYWNrZXRzLiBJZiB0aGUgY2xvc2luZyBicmFja2V0IGlzIGluY2x1ZGVkLA0KICogCQl0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgaXQuDQogKiANCiAqIEBwYXJhbSBtb2RpZmllcnMgaW50DQogKiAJCVRoZSBtb2RpZmllcnMgb2YgdGhlIGNvbnN0cnVjdG9yLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IGludA0KICogCQlUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IGFub255bm91cyB0eXBlIGRlY2xhcmF0aW9uLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgYW5vbnlub3VzIHR5cGUgZGVjbGFyYXRpb24uDQogKiANCiAqIEBwYXJhbSByZWxldmFuY2UgaW50DQogKiAJCVRoZSByZWxldmFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwNCiAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4NCiAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlDQogKiAJCXZhbHVlIGlzIGhpZ2hlci4NCiAqIA0KICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCiAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQogKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuDQogKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuDQogKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqDQogKiBOT1RFOiBwYXJhbWV0ZXIgbmFtZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIG1ldGhvZC4NCiAqLw0Kdm9pZCBhY2NlcHRBbm9ueW1vdXNUeXBlKA0KCWNoYXJbXSBzdXBlclR5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gc3VwZXJUeXBlTmFtZSwNCgljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsDQoJY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLA0KCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLA0KCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwNCglpbnQgbW9kaWZpZXJzLA0KCWludCBjb21wbGV0aW9uU3RhcnQsDQoJaW50IGNvbXBsZXRpb25FbmQsDQoJaW50IHJlbGV2YW5jZSk7DQovKioNCiAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIGNsYXNzIGNvbXBsZXRpb24uDQogKiBAcGFyYW0gcGFja2FnZU5hbWUgY2hhcltdDQogKiAJCURlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLg0KICogDQogKiBAcGFyYW0gY2xhc3NOYW1lIGNoYXJbXQ0KICoJCU5hbWUgb2YgdGhlIGNsYXNzLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgY2hhcltdDQogKgkJVGhlIGNvbXBsZXRpb24gZm9yIHRoZSBjbGFzcy4NCiAqICAgCUNhbiBpbmNsdWRlICc7JyBmb3IgaW1wb3J0ZWQgY2xhc3Nlcy4NCiAqIA0KICogQHBhcmFtIG1vZGlmaWVycyBpbnQNCiAqCQlUaGUgbW9kaWZpZXJzIG9mIHRoZSBjbGFzcy4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBpbnQNCiAqCQlUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25FbmQgaW50DQogKgkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLg0KICogDQogKiAgQHBhcmFtIHJlbGV2YW5jZSBpbnQNCiAqIAkJVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbA0KICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLg0KICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UNCiAqIAkJdmFsdWUgaXMgaGlnaGVyLg0KICoNCiAqIE5PVEUgLSBBbGwgcGFja2FnZSBhbmQgdHlwZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06DQogKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KICogICAgTmVzdGVkIHR5cGUgbmFtZXMgYXJlIGluIHRoZSBxdWFsaWZpZWQgZm9ybSAiQS5NIi4NCiAqICAgIFRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuDQogKi8NCnZvaWQgYWNjZXB0Q2xhc3MoDQoJY2hhcltdIHBhY2thZ2VOYW1lLA0KCWNoYXJbXSBjbGFzc05hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBtb2RpZmllcnMsDQoJaW50IGNvbXBsZXRpb25TdGFydCwNCglpbnQgY29tcGxldGlvbkVuZCwNCglpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgY29tcGlsYXRpb24gZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIGNvbXBsZXRpb24uDQogKiAgQHBhcmFtIGVycm9yIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtDQogKiAgICAgIE9ubHkgcHJvYmxlbXMgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGFzIG5vbi1zeXRheCBlcnJvcnMgYXJlIG5vdGlmaWVkIHRvIHRoZSANCiAqICAgICByZXF1ZXN0b3IsIHdhcm5pbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLg0KICoJCUluIGNhc2UgYW4gZXJyb3IgZ290IHNpZ25hbGVkLCBubyBvdGhlciBjb21wbGV0aW9ucyBtaWdodCBiZSBhdmFpbGFibGUsDQogKgkJdGhlcmVmb3JlIHRoZSBwcm9ibGVtIG1lc3NhZ2Ugc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4NCiAqCQlUaGUgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgcHJvYmxlbSBhcmUgcmVsYXRlZCB0byB0aGUgc291cmNlIHdoZXJlIGl0IHdhcw0KICoJCWRldGVjdGVkIChtaWdodCBiZSBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQsIGlmIGl0IHdhcyBpbmRpcmVjdGx5IHJlcXVlc3RlZA0KICoJCWR1cmluZyB0aGUgY29kZSBhc3Npc3QgcHJvY2VzcykuDQogKiAgICAgIE5vdGU6IHRoZSBwcm9ibGVtIGtub3dzIGl0cyBvcmlnaW5hdGluZyBmaWxlIG5hbWUuDQogKi8NCnZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpOw0KLyoqDQogKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBmaWVsZCBjb21wbGV0aW9uLg0KICogQHBhcmFtIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQgaXMgZGVjbGFyZWQuDQogKiANCiAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgZmllbGQuDQogKiANCiAqIEBwYXJhbSBuYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSBmaWVsZC4NCiAqIA0KICogQHBhcmFtIHR5cGVQYWNrYWdlTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkIGlzIGRlY2xhcmVkLg0KICogDQogKiBAcGFyYW0gdHlwZU5hbWUgY2hhcltdDQogKiAJCU5hbWUgb2YgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZC4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIGNoYXJbXQ0KICogCQlUaGUgY29tcGxldGlvbiBmb3IgdGhlIGZpZWxkLg0KICogDQogKiBAcGFyYW0gbW9kaWZpZXJzIGludA0KICogCQlUaGUgbW9kaWZpZXJzIG9mIHRoaXMgZmllbGQuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKiAJCVRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25FbmQgaW50DQogKiAJCVRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQuDQogKiANCiAqIEBwYXJhbSByZWxldmFuY2UgaW50DQogKiAJCVRoZSByZWxldmFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwNCiAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4NCiAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlDQogKiAJCXZhbHVlIGlzIGhpZ2hlci4NCiAqIA0KICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCiAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQogKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuDQogKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuDQogKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqLw0Kdm9pZCBhY2NlcHRGaWVsZCgNCgljaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLA0KCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwNCgljaGFyW10gbmFtZSwNCgljaGFyW10gdHlwZVBhY2thZ2VOYW1lLA0KCWNoYXJbXSB0eXBlTmFtZSwNCgljaGFyW10gY29tcGxldGlvbk5hbWUsDQoJaW50IG1vZGlmaWVycywNCglpbnQgY29tcGxldGlvblN0YXJ0LA0KCWludCBjb21wbGV0aW9uRW5kLA0KCWludCByZWxldmFuY2UpOw0KLyoqDQogKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYW4gaW50ZXJmYWNlIGNvbXBsZXRpb24uDQogKiBAcGFyYW0gcGFja2FnZU5hbWUgY2hhcltdDQogKiAJCURlY2xhcmluZyBwYWNrYWdlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4NCiAqIA0KICogQHBhcmFtIGNsYXNzTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgaW50ZXJmYWNlLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbk5hbWUgY2hhcltdDQogKiAJCVRoZSBjb21wbGV0aW9uIGZvciB0aGUgaW50ZXJmYWNlLg0KICogICAJQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCBpbnRlcmZhY2VzLg0KICogDQogKiBAcGFyYW0gbW9kaWZpZXJzIGludA0KICogCQlUaGUgbW9kaWZpZXJzIG9mIHRoZSBpbnRlcmZhY2UuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKiAJCVRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZS4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25FbmQgaW50DQogKiAJCVRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UuDQogKiANCiAqIEBwYXJhbSByZWxldmFuY2UgaW50DQogKiAJCVRoZSByZWxldmFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwNCiAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4NCiAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlDQogKiAJCXZhbHVlIGlzIGhpZ2hlci4NCiAqDQogKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCiAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuDQogKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KICovDQp2b2lkIGFjY2VwdEludGVyZmFjZSgNCgljaGFyW10gcGFja2FnZU5hbWUsDQoJY2hhcltdIGludGVyZmFjZU5hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBtb2RpZmllcnMsDQoJaW50IGNvbXBsZXRpb25TdGFydCwNCglpbnQgY29tcGxldGlvbkVuZCwNCglpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEga2V5d29yZCBjb21wbGV0aW9uLg0KICogQHBhcmFtIGtleXdvcmROYW1lIGNoYXJbXQ0KICogCQlUaGUga2V5d29yZCBzb3VyY2UuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKiAJCVRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBrZXl3b3JkLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBrZXl3b3JkLg0KICogDQogKiBAcGFyYW0gcmVsZXZhbmNlIGludA0KICogCQlUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsDQogKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuDQogKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQ0KICogCQl2YWx1ZSBpcyBoaWdoZXIuDQogKi8NCnZvaWQgYWNjZXB0S2V5d29yZChjaGFyW10ga2V5d29yZE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbGFiZWwgY29tcGxldGlvbi4NCiAqIEBwYXJhbSBsYWJlbE5hbWUgY2hhcltdDQogKiAJCVRoZSBsYWJlbCBzb3VyY2UuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKgkJVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIGxhYmVsLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBsYWJlbC4NCiAqIA0KICogQHBhcmFtIHJlbGV2YW5jZSBpbnQNCiAqIAkJVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbA0KICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLg0KICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UNCiAqIAkJdmFsdWUgaXMgaGlnaGVyLg0KICovDQp2b2lkIGFjY2VwdExhYmVsKGNoYXJbXSBsYWJlbE5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUgY29tcGxldGlvbi4NCiAqIEBwYXJhbSBuYW1lIGNoYXJbXQ0KICoJCU5hbWUgb2YgdGhlIG5ldyBsb2NhbCB2YXJpYWJsZS4NCiAqIA0KICogQHBhcmFtIHR5cGVQYWNrYWdlTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgdHlwZSBvZiB0aGlzIG5ldyBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC4NCiAqIA0KICogQHBhcmFtIHR5cGVOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLg0KICogDQogKiBAcGFyYW0gbW9kaWZpZXJzIGludA0KICogCQlUaGUgbW9kaWZpZXJzIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IGludA0KICogCQlUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgbmV3IGxvY2FsIHZhcmlhYmxlLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbG9jYWwgdmFyaWFibGUuDQogKiANCiAqIEBwYXJhbSByZWxldmFuY2UgaW50DQogKiAJCVRoZSByZWxldmFuY2Ugb2YgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWwNCiAqIAkJSXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHdoaWNoIGFyZSB1c2VkIGZvciBkZXRlcm1pbmUgaWYgdGhpcyBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBwcm9wb3NhbC4NCiAqIAkJVGhpcyB2YWx1ZSBjYW4gb25seSBiZSB1c2VkIGZvciBjb21wYXJlIHJlbGV2YW5jZS4gQSBwcm9wb3NhbCBpcyBtb3JlIHJlbGV2YW50IHRoYW4gYW5vdGhlciBpZiBoaXMgcmVsZXZhbmNlDQogKiAJCXZhbHVlIGlzIGhpZ2hlci4NCiAqDQogKiBOT1RFIC0gQWxsIHBhY2thZ2UgYW5kIHR5cGUgbmFtZXMgYXJlIHByZXNlbnRlZCBpbiB0aGVpciByZWFkYWJsZSBmb3JtOg0KICogICAgUGFja2FnZSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gImEuYi5jIi4NCiAqICAgIEJhc2UgdHlwZXMgYXJlIGluIHRoZSBmb3JtICJpbnQiIG9yICJib29sZWFuIi4NCiAqICAgIEFycmF5IHR5cGVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIk1bXSIgb3IgImludFtdIi4NCiAqICAgIE5lc3RlZCB0eXBlIG5hbWVzIGFyZSBpbiB0aGUgcXVhbGlmaWVkIGZvcm0gIkEuTSIuDQogKiAgICBUaGUgZGVmYXVsdCBwYWNrYWdlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5IGFycmF5Lg0KICovDQp2b2lkIGFjY2VwdExvY2FsVmFyaWFibGUoDQoJY2hhcltdIG5hbWUsDQoJY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gdHlwZU5hbWUsDQoJaW50IG1vZGlmaWVycywNCglpbnQgY29tcGxldGlvblN0YXJ0LA0KCWludCBjb21wbGV0aW9uRW5kLA0KCWludCByZWxldmFuY2UpOw0KLyoqDQogKiBDb2RlIGFzc2lzdCBub3RpZmljYXRpb24gb2YgYSBtZXRob2QgY29tcGxldGlvbi4NCiAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUgY2hhcltdDQogKiAJCU5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgdGhhdCBjb250YWlucyB0aGlzIG5ldyBtZXRob2QgaXMgZGVjbGFyZWQuDQogKiANCiAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlTmFtZSBjaGFyW10NCiAqIAkJTmFtZSBvZiB0aGUgdHlwZSBkZWNsYXJpbmcgdGhpcyBuZXcgbWV0aG9kLg0KICogDQogKiBAcGFyYW0gc2VsZWN0b3IgY2hhcltdDQogKiAJCU5hbWUgb2YgdGhlIG5ldyBtZXRob2QuDQogKiANCiAqIEBwYXJhbSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMgY2hhcltdW10NCiAqIAkJTmFtZXMgb2YgdGhlIHBhY2thZ2VzIGluIHdoaWNoIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGRlY2xhcmVkLg0KICogICAgCVNob3VsZCBjb250YWluIGFzIG1hbnkgZWxlbWVudHMgYXMgcGFyYW1ldGVyVHlwZU5hbWVzLg0KICogDQogKiBAcGFyYW0gcGFyYW1ldGVyVHlwZU5hbWVzIGNoYXJbXVtdDQogKiAJCU5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGVzLg0KICogICAgCVNob3VsZCBjb250YWluIGFzIG1hbnkgZWxlbWVudHMgYXMgcGFyYW1ldGVyUGFja2FnZU5hbWVzLg0KICogDQogKiBAcGFyYW0gcmV0dXJuVHlwZVBhY2thZ2VOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSBwYWNrYWdlIGluIHdoaWNoIHRoZSByZXR1cm4gdHlwZSBpcyBkZWNsYXJlZC4NCiAqIA0KICogQHBhcmFtIHJldHVyblR5cGVOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG5ldyBtZXRob2QsIHNob3VsZCBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBjb25zdHJ1Y3Rvci4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIGNoYXJbXQ0KICogCQlUaGUgY29tcGxldGlvbiBmb3IgdGhlIG1ldGhvZC4NCiAqICAgCUNhbiBpbmNsdWRlIHplcm8sIG9uZSBvciB0d28gYnJhY2tldHMuIElmIHRoZSBjbG9zaW5nIGJyYWNrZXQgaXMgaW5jbHVkZWQsIHRoZW4gdGhlIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSBpdC4NCiAqIA0KICogQHBhcmFtIG1vZGlmaWVycyBpbnQNCiAqIAkJVGhlIG1vZGlmaWVycyBvZiB0aGlzIG5ldyBtZXRob2QuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKiAJCVRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbWV0aG9kLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbWV0aG9kLg0KICogDQogKiBAcGFyYW0gcmVsZXZhbmNlIGludA0KICogCQlUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsDQogKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuDQogKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQ0KICogCQl2YWx1ZSBpcyBoaWdoZXIuDQogKg0KICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCiAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQogKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuDQogKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuDQogKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqDQogKiBOT1RFOiBwYXJhbWV0ZXIgbmFtZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwgYWZ0ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIG1ldGhvZC4NCiAqLw0Kdm9pZCBhY2NlcHRNZXRob2QoDQoJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsDQoJY2hhcltdIHNlbGVjdG9yLA0KCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywNCgljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsDQoJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsDQoJY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gcmV0dXJuVHlwZU5hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBtb2RpZmllcnMsDQoJaW50IGNvbXBsZXRpb25TdGFydCwNCglpbnQgY29tcGxldGlvbkVuZCwNCglpbnQgcmVsZXZhbmNlKTsNCgkNCnZvaWQgYWNjZXB0TWV0aG9kRGVjbGFyYXRpb24oDQoJY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsDQoJY2hhcltdIHNlbGVjdG9yLA0KCWNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcywNCgljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsDQoJY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsDQoJY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gcmV0dXJuVHlwZU5hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBtb2RpZmllcnMsDQoJaW50IGNvbXBsZXRpb25TdGFydCwNCglpbnQgY29tcGxldGlvbkVuZCwNCglpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgbW9kaWZpZXIgY29tcGxldGlvbi4NCiAqIEBwYXJhbSBtb2RpZmllck5hbWUgY2hhcltdDQogKiAJCVRoZSBuZXcgbW9kaWZpZXIuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uU3RhcnQgaW50DQogKiAJCVRoZSBzdGFydCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgbW9kaWZpZXIuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIGludA0KICogCQlUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBtb2RpZmllci4NCiAqIA0KICogQHBhcmFtIHJlbGV2YW5jZSBpbnQNCiAqIAkJVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbA0KICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLg0KICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UNCiAqIAkJdmFsdWUgaXMgaGlnaGVyLg0KICovDQp2b2lkIGFjY2VwdE1vZGlmaWVyKGNoYXJbXSBtb2RpZmllck5hbWUsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgcGFja2FnZSBjb21wbGV0aW9uLg0KICogQHBhcmFtIHBhY2thZ2VOYW1lIGNoYXJbXQ0KICogCQlUaGUgcGFja2FnZSBuYW1lLg0KICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIGNoYXJbXQ0KICogCQlUaGUgY29tcGxldGlvbiBmb3IgdGhlIHBhY2thZ2UuDQogKiAgIAlDYW4gaW5jbHVkZSAnLio7JyBmb3IgaW1wb3J0cy4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBpbnQNCiAqIAkJVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIG5ldyBwYWNrYWdlLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvbkVuZCBpbnQNCiAqIAkJVGhlIGVuZCBwb3NpdGlvbiBvZiBpbnNlcnRpb24gb2YgdGhlIG5hbWUgb2YgdGhpcyBuZXcgcGFja2FnZS4NCiAqIA0KICogQHBhcmFtIHJlbGV2YW5jZSBpbnQNCiAqIAkJVGhlIHJlbGV2YW5jZSBvZiB0aGUgY29tcGxldGlvbiBwcm9wb3NhbA0KICogCQlJdCBpcyBhIHBvc2l0aXZlIGludGVnZXIgd2hpY2ggYXJlIHVzZWQgZm9yIGRldGVybWluZSBpZiB0aGlzIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIHByb3Bvc2FsLg0KICogCQlUaGlzIHZhbHVlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGNvbXBhcmUgcmVsZXZhbmNlLiBBIHByb3Bvc2FsIGlzIG1vcmUgcmVsZXZhbnQgdGhhbiBhbm90aGVyIGlmIGhpcyByZWxldmFuY2UNCiAqIAkJdmFsdWUgaXMgaGlnaGVyLg0KICoNCiAqIE5PVEUgLSBBbGwgcGFja2FnZSBuYW1lcyBhcmUgcHJlc2VudGVkIGluIHRoZWlyIHJlYWRhYmxlIGZvcm06DQogKiAgICBQYWNrYWdlIG5hbWVzIGFyZSBpbiB0aGUgZm9ybSAiYS5iLmMiLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqLw0Kdm9pZCBhY2NlcHRQYWNrYWdlKA0KCWNoYXJbXSBwYWNrYWdlTmFtZSwNCgljaGFyW10gY29tcGxldGlvbk5hbWUsDQoJaW50IGNvbXBsZXRpb25TdGFydCwNCglpbnQgY29tcGxldGlvbkVuZCwNCglpbnQgcmVsZXZhbmNlKTsNCi8qKg0KICogQ29kZSBhc3Npc3Qgbm90aWZpY2F0aW9uIG9mIGEgdHlwZSBjb21wbGV0aW9uLg0KICogQHBhcmFtIHBhY2thZ2VOYW1lIGNoYXJbXQ0KICogCQlEZWNsYXJpbmcgcGFja2FnZSBuYW1lIG9mIHRoZSB0eXBlLg0KICogDQogKiBAcGFyYW0gdHlwZU5hbWUgY2hhcltdDQogKiAJCU5hbWUgb2YgdGhlIHR5cGUuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uTmFtZSBjaGFyW10NCiAqIAkJVGhlIGNvbXBsZXRpb24gZm9yIHRoZSB0eXBlLg0KICogICAJQ2FuIGluY2x1ZGUgJzsnIGZvciBpbXBvcnRlZCB0eXBlcy4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25TdGFydCBpbnQNCiAqIAkJVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgdHlwZS4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25FbmQgaW50DQogKiAJCVRoZSBlbmQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSB0eXBlLg0KICogDQogKiBAcGFyYW0gcmVsZXZhbmNlIGludA0KICogCQlUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsDQogKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuDQogKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQ0KICogCQl2YWx1ZSBpcyBoaWdoZXIuDQogKg0KICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCiAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQogKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqLw0Kdm9pZCBhY2NlcHRUeXBlKA0KCWNoYXJbXSBwYWNrYWdlTmFtZSwNCgljaGFyW10gdHlwZU5hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBjb21wbGV0aW9uU3RhcnQsDQoJaW50IGNvbXBsZXRpb25FbmQsDQoJaW50IHJlbGV2YW5jZSk7DQoJDQovKioNCiAqIENvZGUgYXNzaXN0IG5vdGlmaWNhdGlvbiBvZiBhIHZhcmlhYmxlIG5hbWUgY29tcGxldGlvbi4NCiAqIEBwYXJhbSB0eXBlUGFja2FnZU5hbWUgY2hhcltdDQogKiAJCU5hbWUgb2YgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZC4NCiAqIA0KICogQHBhcmFtIHR5cGVOYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSB0eXBlIG9mIHRoaXMgdmFyaWFibGUuDQogKiANCiAqIEBwYXJhbSBuYW1lIGNoYXJbXQ0KICogCQlOYW1lIG9mIHRoZSB2YXJpYWJsZS4NCiAqIA0KICogQHBhcmFtIGNvbXBsZXRpb25OYW1lIGNoYXJbXQ0KICogCQlUaGUgY29tcGxldGlvbiBmb3IgdGhlIHZhcmlhYmxlLg0KICogDQogKiBAcGFyYW0gY29tcGxldGlvblN0YXJ0IGludA0KICogCQlUaGUgc3RhcnQgcG9zaXRpb24gb2YgaW5zZXJ0aW9uIG9mIHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUuDQogKiANCiAqIEBwYXJhbSBjb21wbGV0aW9uRW5kIGludA0KICogCQlUaGUgZW5kIHBvc2l0aW9uIG9mIGluc2VydGlvbiBvZiB0aGUgbmFtZSBvZiB0aGlzIHZhcmlhYmxlLg0KICogDQogKiBAcGFyYW0gcmVsZXZhbmNlIGludA0KICogCQlUaGUgcmVsZXZhbmNlIG9mIHRoZSBjb21wbGV0aW9uIHByb3Bvc2FsDQogKiAJCUl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciB3aGljaCBhcmUgdXNlZCBmb3IgZGV0ZXJtaW5lIGlmIHRoaXMgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgcHJvcG9zYWwuDQogKiAJCVRoaXMgdmFsdWUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgY29tcGFyZSByZWxldmFuY2UuIEEgcHJvcG9zYWwgaXMgbW9yZSByZWxldmFudCB0aGFuIGFub3RoZXIgaWYgaGlzIHJlbGV2YW5jZQ0KICogCQl2YWx1ZSBpcyBoaWdoZXIuDQogKg0KICogTk9URSAtIEFsbCBwYWNrYWdlIGFuZCB0eXBlIG5hbWVzIGFyZSBwcmVzZW50ZWQgaW4gdGhlaXIgcmVhZGFibGUgZm9ybToNCiAqICAgIFBhY2thZ2UgbmFtZXMgYXJlIGluIHRoZSBmb3JtICJhLmIuYyIuDQogKiAgICBCYXNlIHR5cGVzIGFyZSBpbiB0aGUgZm9ybSAiaW50IiBvciAiYm9vbGVhbiIuDQogKiAgICBBcnJheSB0eXBlcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJNW10iIG9yICJpbnRbXSIuDQogKiAgICBOZXN0ZWQgdHlwZSBuYW1lcyBhcmUgaW4gdGhlIHF1YWxpZmllZCBmb3JtICJBLk0iLg0KICogICAgVGhlIGRlZmF1bHQgcGFja2FnZSBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS4NCiAqLw0Kdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoDQoJY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwNCgljaGFyW10gdHlwZU5hbWUsDQoJY2hhcltdIG5hbWUsDQoJY2hhcltdIGNvbXBsZXRpb25OYW1lLA0KCWludCBjb21wbGV0aW9uU3RhcnQsDQoJaW50IGNvbXBsZXRpb25FbmQsDQoJaW50IHJlbGV2YW5jZSk7DQp9DQo=