LyoqIEBmaWxlDQogIFRoaXMgZmlsZSBkZWNsYXJlcyBSZWFkLW9ubHkgVmFyaWFibGUgU2VydmljZSBQUEkNCg0KICBDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UgICAgICAgICANCiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQogIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgICAgICAgICAgIA0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KICBNb2R1bGUgTmFtZTogIFJlYWRPbmx5VmFyaWFibGUuaA0KDQogIEBwYXIgUmV2aXNpb24gUmVmZXJlbmNlOg0KICBUaGlzIFBQSSBpcyBkZWZpbmVkIGluIFBFSSBDSVMNCiAgVmVyc2lvbiAwLjkxLg0KDQoqKi8NCg0KI2lmbmRlZiBfX1BFSV9SRUFEX09OTFlfVkFSSUFCTEVfUFBJX0hfXw0KI2RlZmluZSBfX1BFSV9SRUFEX09OTFlfVkFSSUFCTEVfUFBJX0hfXw0KDQojZGVmaW5lIEVGSV9QRUlfUkVBRF9PTkxZX1ZBUklBQkxFX0FDQ0VTU19QUElfR1VJRCBcDQogIHsgXA0KICAgIDB4M2NkYzkwYzYsIDB4MTNmYiwgMHg0YTc1LCB7MHg5ZSwgMHg3OSwgMHg1OSwgMHhlOSwgMHhkZCwgMHg3OCwgMHhiOSwgMHhmYSB9IFwNCiAgfQ0KDQp0eXBlZGVmIHN0cnVjdCBfRUZJX1BFSV9SRUFEX09OTFlfVkFSSUFCTEVfUFBJICBFRklfUEVJX1JFQURfT05MWV9WQVJJQUJMRV9QUEk7DQoNCi8vDQovLyBWYXJpYWJsZSBhdHRyaWJ1dGVzDQovLw0KI2RlZmluZSBFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFICAgICAgIDB4MDAwMDAwMDENCiNkZWZpbmUgRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyAweDAwMDAwMDAyDQojZGVmaW5lIEVGSV9WQVJJQUJMRV9SVU5USU1FX0FDQ0VTUyAgICAgMHgwMDAwMDAwNA0KI2RlZmluZSBFRklfVkFSSUFCTEVfUkVBRF9PTkxZICAgICAgICAgIDB4MDAwMDAwMDgNCg0KLyoqDQogIEdldCBWYXJpYWJsZSB2YWx1ZSBieSBOYW1lIGFuZCBHVUlEIHBhaXINCg0KICBAcGFyYW0gIFBlaVNlcnZpY2VzIEFuIGluZGlyZWN0IHBvaW50ZXIgdG8gdGhlIFBFSSBTZXJ2aWNlcyBUYWJsZSBwdWJsaXNoZWQgYnkgdGhlIFBFSSBGb3VuZGF0aW9uLiANCiAgDQogIEBwYXJhbSAgVmFyaWFibGVOYW1lIEEgTlVMTC10ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvcqGvcyB2YXJpYWJsZS4gDQogIA0KICBAcGFyYW0gIFZlbmRvckd1aWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHZlbmRvci4NCiAgDQogIEBwYXJhbSAgQXR0cmlidXRlcyBJZiBub3QgTlVMTCwgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgbG9jYXRpb24gdG8gcmV0dXJuIA0KICB0aGUgYXR0cmlidXRlcyBiaXRtYXNrIGZvciB0aGUgdmFyaWFibGUuDQogIA0KICBAcGFyYW0gIERhdGFTaXplIE9uIGlucHV0LCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmV0dXJuIERhdGEgYnVmZmVyLg0KICBPbiBvdXRwdXQsIHRoZSBzaXplIG9mIGRhdGEgcmV0dXJuZWQgaW4gRGF0YS4NCiAgDQogIEBwYXJhbSAgRGF0YSBUaGUgYnVmZmVyIHRvIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlLg0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgVGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIA0KICANCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EIFRoZSB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLg0KICANCiAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCBUaGUgQnVmZmVyU2l6ZSBpcyB0b28gc21hbGwgZm9yIHRoZSByZXN1bHQuDQogIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIGludmFsaWQgdmFsdWUuDQogIA0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgVGhlIHZhcmlhYmxlIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuDQoNCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BFSV9HRVRfVkFSSUFCTEUpICgNCiAgSU4gRUZJX1BFSV9TRVJWSUNFUyAgICAgICAgICAgICAqKlBlaVNlcnZpY2VzLA0KICBJTiBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWUsDQogIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQsDQogIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkF0dHJpYnV0ZXMgT1BUSU9OQUwsDQogIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkRhdGFTaXplLA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhDQogICk7DQoNCi8qKg0KICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gcmV0cmlldmUgdGhlIFZhcmlhYmxlTmFtZSANCiAgYW5kIFZlbmRvckd1aWQgb2YgYWxsIHZhcmlhYmxlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIE9uIGVhY2ggY2FsbCANCiAgdG8gR2V0TmV4dFZhcmlhYmxlTmFtZSgpIHRoZSBwcmV2aW91cyByZXN1bHRzIGFyZSBwYXNzZWQgaW50byB0aGUgaW50ZXJmYWNlLCANCiAgYW5kIG9uIG91dHB1dCB0aGUgaW50ZXJmYWNlIHJldHVybnMgdGhlIG5leHQgdmFyaWFibGUgbmFtZSBkYXRhLiAgV2hlbiB0aGUgDQogIGVudGlyZSB2YXJpYWJsZSBsaXN0IGhhcyBiZWVuIHJldHVybmVkLCB0aGUgZXJyb3IgRUZJX05PVF9GT1VORCBpcyByZXR1cm5lZC4NCg0KICBAcGFyYW0gIFBlaVNlcnZpY2VzIEFuIGluZGlyZWN0IHBvaW50ZXIgdG8gdGhlIFBFSSBTZXJ2aWNlcyBUYWJsZSBwdWJsaXNoZWQgYnkgdGhlIFBFSSBGb3VuZGF0aW9uLiANCiAgDQogIEBwYXJhbSAgVmFyaWFibGVOYW1lU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgVmFyaWFibGVOYW1lIGJ1ZmZlci4NCiAgDQogIEBwYXJhbSAgVmFyaWFibGVOYW1lIE9uIGlucHV0LCBzdXBwbGllcyB0aGUgbGFzdCBWYXJpYWJsZU5hbWUgdGhhdCB3YXMgDQogIHJldHVybmVkIGJ5IEdldE5leHRWYXJpYWJsZU5hbWUoKS4gIE9uIG91dHB1dCwgcmV0dXJucyB0aGUgTnVsbC10ZXJtaW5hdGVkIA0KICBVbmljb2RlIHN0cmluZyBvZiB0aGUgY3VycmVudCB2YXJpYWJsZS4NCiAgDQogIEBwYXJhbSAgVmVuZG9yR3VpZCBPbiBpbnB1dCwgc3VwcGxpZXMgdGhlIGxhc3QgVmVuZG9yR3VpZCB0aGF0IHdhcyANCiAgcmV0dXJuZWQgYnkgR2V0TmV4dFZhcmlhYmxlTmFtZSgpLiAgT24gb3V0cHV0LCByZXR1cm5zIHRoZSBWZW5kb3JHdWlkIA0KICBvZiB0aGUgY3VycmVudCB2YXJpYWJsZS4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTIFRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiANCiAgDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCBUaGUgbmV4dCB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLg0KICANCiAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCBUaGUgVmFyaWFibGVOYW1lU2l6ZSBpcyB0b28gc21hbGwgZm9yIHRoZSByZXN1bHQuDQogIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaGFzIGFuIGludmFsaWQgdmFsdWUuDQogIA0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgVGhlIHZhcmlhYmxlIG5hbWUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4NCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUEVJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUpICgNCiAgSU4gRUZJX1BFSV9TRVJWSUNFUyAgICAgICAgICAgICAqKlBlaVNlcnZpY2VzLA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWVTaXplLA0KICBJTiBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWUsDQogIElOIE9VVCBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlZlbmRvckd1aWQNCiAgKTsNCg0KLyoqDQogIEBwYXIgUHBpIERlc2NyaXB0aW9uOg0KICBUaGlzIFBQSSBwcm92aWRlcyBhIGxpZ2h0d2VpZ2h0LCByZWFkLW9ubHkgdmFyaWFudCBvZiB0aGUgZnVsbCBFRkkgDQogIHZhcmlhYmxlIHNlcnZpY2VzLiANCg0KICBAcGFyYW0gR2V0VmFyaWFibGUNCiAgQSBzZXJ2aWNlIHRvIGFzY2VydGFpbiBhIGdpdmVuIHZhcmlhYmxlIG5hbWUuDQoNCiAgQHBhcmFtIEdldE5leHRWYXJpYWJsZU5hbWUNCiAgQSBzZXJ2aWNlIHRvIGFzY2VydGFpbiBhIHZhcmlhYmxlIGJhc2VkIHVwb24gYSBnaXZlbiwga25vd24gdmFyaWFibGUNCg0KKiovDQpzdHJ1Y3QgX0VGSV9QRUlfUkVBRF9PTkxZX1ZBUklBQkxFX1BQSSB7DQogIEVGSV9QRUlfR0VUX1ZBUklBQkxFICAgICAgICAgICAgUGVpR2V0VmFyaWFibGU7DQogIEVGSV9QRUlfR0VUX05FWFRfVkFSSUFCTEVfTkFNRSAgUGVpR2V0TmV4dFZhcmlhYmxlTmFtZTsNCn07DQoNCmV4dGVybiBFRklfR1VJRCBnRWZpUGVpUmVhZE9ubHlWYXJpYWJsZVBwaUd1aWQ7DQoNCiNlbmRpZg0K