LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpEYXRhOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCnB1YmxpYyByZWYgY2xhc3MgQWNjb3VudCBzZWFsZWQgOiBwdWJsaWMgSU5vdGlmeVByb3BlcnR5Q2hhbmdlZA0Kew0KcHVibGljOg0KICAgIEFjY291bnQoU3RyaW5nXiBuYW1lLCBTdHJpbmdeIHJpbmdJRCwgU3RyaW5nXiBhY2NvdW50VHlwZSwgU3RyaW5nXiBhY2NvdW50SUQsIFN0cmluZ14gZGV2aWNlSWQsIGJvb2wgdXBucFN0YXRlDQogICAgICAgICAgICAsIFN0cmluZ14gc2lwSG9zdG5hbWUsIFN0cmluZ14gc2lwVXNlcm5hbWUsIFN0cmluZ14gc2lwUGFzc3dvcmQpOw0KDQogICAgdmlydHVhbCBldmVudCBQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJeIFByb3BlcnR5Q2hhbmdlZDsNCg0KICAgIHByb3BlcnR5IFN0cmluZ14gbmFtZV8NCiAgICB7DQogICAgICAgIFN0cmluZ14gZ2V0KCkgew0KICAgICAgICAgICAgcmV0dXJuIGFsaWFzXzsNCiAgICAgICAgfQ0KICAgICAgICB2b2lkIHNldChTdHJpbmdeIHZhbHVlKSB7DQogICAgICAgICAgICBhbGlhc18gPSB2YWx1ZTsNCiAgICAgICAgICAgIE5vdGlmeVByb3BlcnR5Q2hhbmdlZCgibmFtZV8iKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwcm9wZXJ0eSBTdHJpbmdeIHJpbmdJRF8gew0KICAgICAgICBTdHJpbmdeIGdldCgpIHsNCiAgICAgICAgICAgIHJldHVybiByaW5nSURfXzsNCiAgICAgICAgfQ0KICAgICAgICB2b2lkIHNldChTdHJpbmdeIHZhbHVlKSB7DQogICAgICAgICAgICByaW5nSURfXyA9IHZhbHVlOw0KICAgICAgICAgICAgTm90aWZ5UHJvcGVydHlDaGFuZ2VkKCJyaW5nSURfIik7DQogICAgICAgIH0NCiAgICB9DQogICAgcHJvcGVydHkgU3RyaW5nXiBhY2NvdW50VHlwZV87IC8vIHJlZmFjdG8gOiBjcmVhdGUgYSBlbnVtIGFjY291bnRUeXBlDQogICAgcHJvcGVydHkgU3RyaW5nXiBhY2NvdW50SURfOw0KICAgIHByb3BlcnR5IFN0cmluZ14gX2RldmljZUlkOw0KICAgIHByb3BlcnR5IFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpJVmVjdG9yPFN0cmluZ14+XiBfZGV2aWNlc0lkTGlzdCB7DQogICAgICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpJVmVjdG9yPFN0cmluZ14+XiBnZXQoKSB7DQogICAgICAgICAgICByZXR1cm4gZGV2aWNlc0lkTGlzdF87DQogICAgICAgIH0NCiAgICAgICAgdm9pZCBzZXQoV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OklWZWN0b3I8U3RyaW5nXj5eIHZhbHVlKSB7DQogICAgICAgICAgICBkZXZpY2VzSWRMaXN0XyA9IHZhbHVlOw0KICAgICAgICB9DQogICAgfTsNCiAgICBwcm9wZXJ0eSBib29sIF91cG5wU3RhdGU7DQogICAgcHJvcGVydHkgU3RyaW5nXiBfc2lwSG9zdG5hbWU7DQogICAgcHJvcGVydHkgU3RyaW5nXiBfc2lwVXNlcm5hbWUNCiAgICB7DQogICAgICAgIFN0cmluZ14gZ2V0KCkgew0KICAgICAgICAgICAgcmV0dXJuIHNpcFVzZXJuYW1lXzsNCiAgICAgICAgfQ0KICAgICAgICB2b2lkIHNldChTdHJpbmdeIHZhbHVlKSB7DQogICAgICAgICAgICBzaXBVc2VybmFtZV8gPSB2YWx1ZTsNCiAgICAgICAgICAgIE5vdGlmeVByb3BlcnR5Q2hhbmdlZCgiX3NpcFVzZXJuYW1lIik7DQogICAgICAgIH0NCiAgICB9DQogICAgcHJvcGVydHkgU3RyaW5nXiBfc2lwUGFzc3dvcmQ7IC8vIHJlZmFjdG8gOiB0aGluayB0byBlbmNyeXB0IHBhc3N3b3JkIGluIG1lbW9yeQ0KDQpwcm90ZWN0ZWQ6DQogICAgdm9pZCBOb3RpZnlQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nXiBwcm9wZXJ0eU5hbWUpOw0KDQpwcml2YXRlOg0KICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpJVmVjdG9yPFN0cmluZ14+XiBkZXZpY2VzSWRMaXN0XzsNCiAgICBTdHJpbmdeIGFsaWFzXzsNCiAgICBTdHJpbmdeIHJpbmdJRF9fOw0KICAgIFN0cmluZ14gc2lwVXNlcm5hbWVfOw0KDQp9Ow0KfQ0KDQo=