LyoqIEBmaWxlDQpDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxCUj4NClRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCmFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQ0Kd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdA0KaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocA0KDQpUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuDQoNCioqLw0KDQpEZXZpY2UoSU9URCkgeyANCiAgTmFtZShfSElELCAiTVNGVDgwMDAiKQ0KICBOYW1lKF9DSUQsICJNU0ZUODAwMCIpDQogIA0KICBOYW1lKF9DUlMsIFJlc291cmNlVGVtcGxhdGUoKSB7ICANCiAgICAvLyBJbmRleCAwIA0KICAgIFNQSVNlcmlhbEJ1cyggICAgICAgICAgICAvLyBQaW4gNSwgNywgOSAsIDExIG9mIEpQMSBmb3IgU0lPX1NQSQ0KICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAvLyBEZXZpY2Ugc2VsZWN0aW9uDQogICAgICBQb2xhcml0eUxvdywgICAgICAgICAgIC8vIERldmljZSBzZWxlY3Rpb24gcG9sYXJpdHkNCiAgICAgIEZvdXJXaXJlTW9kZSwgICAgICAgICAgLy8gd2lyZW1vZGUNCiAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJpdCBsZW4NCiAgICAgIENvbnRyb2xsZXJJbml0aWF0ZWQsICAgLy8gc2xhdmUgbW9kZQ0KICAgICAgODAwMDAwMCwgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHNwZWVkDQogICAgICBDbG9ja1BvbGFyaXR5TG93LCAgICAgIC8vIENsb2NrIHBvbGFyaXR5DQogICAgICBDbG9ja1BoYXNlU2Vjb25kLCAgICAgIC8vIGNsb2NrIHBoYXNlDQogICAgICAiXFxfU0IuU1BJMSIsICAgICAgICAgIC8vIFJlc291cmNlU291cmNlOiBTUEkgYnVzIGNvbnRyb2xsZXIgbmFtZQ0KICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZVNvdXJjZUluZGV4DQogICAgICBSZXNvdXJjZUNvbnN1bWVyLCAgICAgIC8vIFJlc291cmNlIHVzYWdlDQogICAgICBKU1BJLCAgICAgICAgICAgICAgICAgIC8vIERlc2NyaXB0b3JOYW1lOiBjcmVhdGVzIG5hbWUgZm9yIG9mZnNldCBvZiByZXNvdXJjZSBkZXNjcmlwdG9yDQogICAgICApICAgICAgICAgICAgICAgICAgICAgIC8vIFZlbmRvciBEYXRhICANCiAgICANCiAgICAvLyBJbmRleCAxICAgICANCiAgICBJMkNTZXJpYWxCdXMoICAgICAgICAgICAgLy8gUGluIDEzLCAxNSBvZiBKUDEsIGZvciBTSU9fSTJDNSAoc2lnbmFsKQ0KICAgICAgMHgwMCwgICAgICAgICAgICAgICAgICAvLyBTbGF2ZUFkZHJlc3M6IGJ1cyBhZGRyZXNzIChUQkQpDQogICAgICAsICAgICAgICAgICAgICAgICAgICAgIC8vIFNsYXZlTW9kZTogZGVmYXVsdCB0byBDb250cm9sbGVySW5pdGlhdGVkDQogICAgICA0MDAwMDAsICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb25TcGVlZDogaW4gSHoNCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkcmVzc2luZyBNb2RlOiBkZWZhdWx0IHRvIDcgYml0DQogICAgICAiXFxfU0IuSTJDNiIsICAgICAgICAgIC8vIFJlc291cmNlU291cmNlOiBJMkMgYnVzIGNvbnRyb2xsZXIgbmFtZSAoRm9yIE1pbm5vd0JvYXJkIE1heCwgaGFyZHdhcmUgSTJDNSgwLWJhc2VkKSBpcyByZXBvcnRlZCBhcyBBQ1BJIEkyQzYoMS1iYXNlZCkpDQogICAgICAsDQogICAgICAsDQogICAgICBKSTJDLCAgICAgICAgICAgICAgICAgIC8vIERlc2NyaXB0b3IgTmFtZTogY3JlYXRlcyBuYW1lIGZvciBvZmZzZXQgb2YgcmVzb3VyY2UgZGVzY3JpcHRvcg0KICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAvLyBWZW5kb3JEYXRhDQogICAgDQogICAgLy8gSW5kZXggMg0KICAgIFVBUlRTZXJpYWxCdXMoICAgICAgICAgICAvLyBQaW4gMTcsIDE5IG9mIEpQMSwgZm9yIFNJT19VQVJUMg0KICAgICAgMTE1MjAwLCAgICAgICAgICAgICAgICAvLyBJbml0aWFsQmF1ZFJhdGU6IGluIGJpdHMgYmVyIHNlY29uZA0KICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAvLyBCaXRzUGVyQnl0ZTogZGVmYXVsdCB0byA4IGJpdHMNCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcEJpdHM6IERlZmF1bHRzIHRvIG9uZSBiaXQNCiAgICAgIDB4ZmMsICAgICAgICAgICAgICAgICAgLy8gTGluZXNJblVzZTogOCAxLWJpdCBmbGFncyB0byBkZWNsYXJlIGxpbmUgZW5hYmxlZA0KICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAvLyBJc0JpZ0VuZGlhbjogZGVmYXVsdCB0byBMaXR0bGVFbmRpYW4NCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyaXR5OiBEZWZhdWx0cyB0byBubyBwYXJpdHkNCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gRmxvd0NvbnRyb2w6IERlZmF1bHRzIHRvIG5vIGZsb3cgY29udHJvbA0KICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvLyBSZWNlaXZlQnVmZmVyU2l6ZQ0KICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc21pdEJ1ZmZlclNpemUNCiAgICAgICJcXF9TQi5VUlQyIiwgICAgICAgICAgLy8gUmVzb3VyY2VTb3VyY2U6IFVBUlQgYnVzIGNvbnRyb2xsZXIgbmFtZQ0KICAgICAgLA0KICAgICAgLA0KICAgICAgVUFSMiwgICAgICAgICAgICAgICAgICAvLyBEZXNjcmlwdG9yTmFtZTogY3JlYXRlcyBuYW1lIGZvciBvZmZzZXQgb2YgcmVzb3VyY2UgZGVzY3JpcHRvcg0KICAgICAgKSAgICAgICAgICAgICAgICAgICAgICANCiAgICANCiAgICAvLyBJbmRleCAzDQogICAgR3Bpb0lvIChTaGFyZWQsIFB1bGxEZWZhdWx0LCAwLCAwLCBJb1Jlc3RyaWN0aW9uTm9uZSwgIlxcX1NCLkdQTzIiLCkgezB9ICAvLyBQaW4gMjEgb2YgSlAxIChHUElPX1M1WzAwXSkNCiAgICAvLyBJbmRleCA0DQogICAgR3Bpb0ludChFZGdlLCBBY3RpdmVCb3RoLCBTaGFyZWRBbmRXYWtlLCBQdWxsTm9uZSwgMCwiXFxfU0IuR1BPMiIsKSB7MH0gDQogICAgDQogICAgLy8gSW5kZXggNQ0KICAgIEdwaW9JbyAoU2hhcmVkLCBQdWxsRGVmYXVsdCwgMCwgMCwgSW9SZXN0cmljdGlvbk5vbmUsICJcXF9TQi5HUE8yIiwpIHsxfSAgLy8gUGluIDIzIG9mIEpQMSAoR1BJT19TNVswMV0pDQogICAgLy8gSW5kZXggNg0KICAgIEdwaW9JbnQoRWRnZSwgQWN0aXZlQm90aCwgU2hhcmVkQW5kV2FrZSwgUHVsbE5vbmUsIDAsIlxcX1NCLkdQTzIiLCkgezF9DQogICAgDQogICAgLy8gSW5kZXggNw0KICAgIEdwaW9JbyAoU2hhcmVkLCBQdWxsRGVmYXVsdCwgMCwgMCwgSW9SZXN0cmljdGlvbk5vbmUsICJcXF9TQi5HUE8yIiwpIHsyfSAgLy8gUGluIDI1IG9mIEpQMSAoR1BJT19TNVswMl0pDQogICAgLy8gSW5kZXggOA0KICAgIEdwaW9JbnQoRWRnZSwgQWN0aXZlQm90aCwgU2hhcmVkQW5kV2FrZSwgUHVsbE5vbmUsIDAsIlxcX1NCLkdQTzIiLCkgezJ9IA0KICAgIA0KICAgIC8vIEluZGV4IDkNCiAgICBVQVJUU2VyaWFsQnVzKCAgICAgICAgICAgLy8gUGluIDYsIDgsIDEwLCAxMiBvZiBKUDEsIGZvciBTSU9fVUFSVDENCiAgICAgIDExNTIwMCwgICAgICAgICAgICAgICAgLy8gSW5pdGlhbEJhdWRSYXRlOiBpbiBiaXRzIGJlciBzZWNvbmQNCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gQml0c1BlckJ5dGU6IGRlZmF1bHQgdG8gOCBiaXRzDQogICAgICAsICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3BCaXRzOiBEZWZhdWx0cyB0byBvbmUgYml0DQogICAgICAweGZjLCAgICAgICAgICAgICAgICAgIC8vIExpbmVzSW5Vc2U6IDggMS1iaXQgZmxhZ3MgdG8gZGVjbGFyZSBsaW5lIGVuYWJsZWQNCiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgLy8gSXNCaWdFbmRpYW46IGRlZmF1bHQgdG8gTGl0dGxlRW5kaWFuDQogICAgICAsICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcml0eTogRGVmYXVsdHMgdG8gbm8gcGFyaXR5DQogICAgICBGbG93Q29udHJvbEhhcmR3YXJlLCAgIC8vIEZsb3dDb250cm9sOiBEZWZhdWx0cyB0byBubyBmbG93IGNvbnRyb2wNCiAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLy8gUmVjZWl2ZUJ1ZmZlclNpemUNCiAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNtaXRCdWZmZXJTaXplDQogICAgICAiXFxfU0IuVVJUMSIsICAgICAgICAgIC8vIFJlc291cmNlU291cmNlOiBVQVJUIGJ1cyBjb250cm9sbGVyIG5hbWUNCiAgICAgICwNCiAgICAgICwNCiAgICAgIFVBUjEsICAgICAgICAgICAgICAvLyBEZXNjcmlwdG9yTmFtZTogY3JlYXRlcyBuYW1lIGZvciBvZmZzZXQgb2YgcmVzb3VyY2UgZGVzY3JpcHRvcg0KICAgICAgKSAgDQogICAgDQogICAgLy8gSW5kZXggMTANCiAgICBHcGlvSW8gKFNoYXJlZCwgUHVsbERlZmF1bHQsIDAsIDAsIElvUmVzdHJpY3Rpb25Ob25lLCAiXFxfU0IuR1BPMCIsKSB7NjJ9ICAvLyBQaW4gMTQgb2YgSlAxIChHUElPX1NDWzYyXSkNCiAgICAvLyBJbmRleCAxMQ0KICAgIEdwaW9JbnQoRWRnZSwgQWN0aXZlQm90aCwgU2hhcmVkQW5kV2FrZSwgUHVsbE5vbmUsIDAsIlxcX1NCLkdQTzAiLCkgezYyfSANCiAgICANCiAgICAvLyBJbmRleCAxMg0KICAgIEdwaW9JbyAoU2hhcmVkLCBQdWxsRGVmYXVsdCwgMCwgMCwgSW9SZXN0cmljdGlvbk5vbmUsICJcXF9TQi5HUE8wIiwpIHs2M30gIC8vIFBpbiAxNiBvZiBKUDEgKEdQSU9fU0NbNjNdKQ0KICAgIC8vIEluZGV4IDEzDQogICAgR3Bpb0ludChFZGdlLCBBY3RpdmVCb3RoLCBTaGFyZWRBbmRXYWtlLCBQdWxsTm9uZSwgMCwiXFxfU0IuR1BPMCIsKSB7NjN9IA0KICAgIA0KICAgIC8vIEluZGV4IDE0DQogICAgR3Bpb0lvIChTaGFyZWQsIFB1bGxEZWZhdWx0LCAwLCAwLCBJb1Jlc3RyaWN0aW9uTm9uZSwgIlxcX1NCLkdQTzAiLCkgezY1fSAgLy8gUGluIDE4IG9mIEpQMSAoR1BJT19TQ1s2NV0pDQogICAgLy8gSW5kZXggMTUNCiAgICBHcGlvSW50KEVkZ2UsIEFjdGl2ZUJvdGgsIFNoYXJlZEFuZFdha2UsIFB1bGxOb25lLCAwLCJcXF9TQi5HUE8wIiwpIHs2NX0gDQogICAgDQogICAgLy8gSW5kZXggMTYNCiAgICBHcGlvSW8gKFNoYXJlZCwgUHVsbERlZmF1bHQsIDAsIDAsIElvUmVzdHJpY3Rpb25Ob25lLCAiXFxfU0IuR1BPMCIsKSB7NjR9ICAvLyBQaW4gMjAgb2YgSlAxIChHUElPX1NDWzY0XSkNCiAgICAvLyBJbmRleCAxNw0KICAgIEdwaW9JbnQoRWRnZSwgQWN0aXZlQm90aCwgU2hhcmVkQW5kV2FrZSwgUHVsbE5vbmUsIDAsIlxcX1NCLkdQTzAiLCkgezY0fSANCiAgICANCiAgICAvLyBJbmRleCAxOA0KICAgIEdwaW9JbyAoU2hhcmVkLCBQdWxsRGVmYXVsdCwgMCwgMCwgSW9SZXN0cmljdGlvbk5vbmUsICJcXF9TQi5HUE8wIiwpIHs5NH0gIC8vIFBpbiAyMiBvZiBKUDEgKEdQSU9fU0NbOTRdKQ0KICAgIC8vIEluZGV4IDE5DQogICAgR3Bpb0ludChFZGdlLCBBY3RpdmVCb3RoLCBTaGFyZWRBbmRXYWtlLCBQdWxsTm9uZSwgMCwiXFxfU0IuR1BPMCIsKSB7OTR9IA0KICAgIA0KICAgIC8vIEluZGV4IDIwDQogICAgR3Bpb0lvIChTaGFyZWQsIFB1bGxEZWZhdWx0LCAwLCAwLCBJb1Jlc3RyaWN0aW9uTm9uZSwgIlxcX1NCLkdQTzAiLCkgezk1fSAgLy8gUGluIDI0IG9mIEpQMSAoR1BJT19TQ1s5NV0pDQogICAgLy8gSW5kZXggMjENCiAgICBHcGlvSW50KEVkZ2UsIEFjdGl2ZUJvdGgsIFNoYXJlZEFuZFdha2UsIFB1bGxOb25lLCAwLCJcXF9TQi5HUE8wIiwpIHs5NX0gDQogICAgDQogICAgLy8gSW5kZXggMjINCiAgICBHcGlvSW8gKFNoYXJlZCwgUHVsbERlZmF1bHQsIDAsIDAsIElvUmVzdHJpY3Rpb25Ob25lLCAiXFxfU0IuR1BPMCIsKSB7NTR9ICAvLyBQaW4gMjYgb2YgSlAxIChHUElPX1NDWzU0XSkNCiAgICAvLyBJbmRleCAyMw0KICAgIEdwaW9JbnQoRWRnZSwgQWN0aXZlQm90aCwgU2hhcmVkQW5kV2FrZSwgUHVsbE5vbmUsIDAsIlxcX1NCLkdQTzAiLCkgezU0fQ0KICB9KQ0KDQogIE5hbWUoX0RTRCwgUGFja2FnZSgpIHsNCiAgICBUb1VVSUQoImRhZmZkODE0LTZlYmEtNGQ4Yy04YTkxLWJjOWJiZjRhYTMwMSIpLA0KICAgIFBhY2thZ2UoMSkgewkgIC8vIEp1c3Qgb25lIFByb3BlcnR5IGZvciBJT1QgKGF0IHRoaXMgdGltZSkgDQogICAgICBQYWNrYWdlKDIpIHsJLy9UaGUgk3N5bWJvbGljLWlkZW50aWZpZXJzlCBwcm9wZXJ0eQ0KICAgICAgICAic3ltYm9saWMtaWRlbnRpZmllcnMiLCANCiAgICAgICAgUGFja2FnZSgpIHsJLy9Db250YWlucyBhbGwgdGhlIDxyZXNvdXJjZSBpbmRleCwgc3ltYm9saWMtaWRlbnRpZmllcj4gcGFpcnMgICAgICAgDQogICAgICAgICAgMCwgIlNQSTAiLAkgIA0KICAgICAgICAgIDEsICJJMkM1IiwJCQ0KICAgICAgICAgIDIsICJVQVJUMiIsDQogICAgICAgICAgMywgMjEsICAgICAgIC8vIFBpbiAyMSBvZiBKUDEgKEdQSU9fUzVbMDBdKQ0KICAgICAgICAgIDQsIDIxLCAgICAgICAvLyBQaW4gMjEgZm9yIHNlcGFyYXRlIHJlc291cmNlLiANCiAgICAgICAgICA1LCAyMywgICAgICAgLy8gUGluIDIzIG9mIEpQMSAoR1BJT19TNVswMV0pDQogICAgICAgICAgNiwgMjMsDQogICAgICAgICAgNywgMjUsICAgICAgIC8vIFBpbiAyNSBvZiBKUDEgKEdQSU9fUzVbMDJdKQ0KICAgICAgICAgIDgsIDI1LA0KICAgICAgICAgIDksICJVQVJUMSIsDQogICAgICAgICAgMTAsIDE0LCAgICAgIC8vIFBpbiAxNCBvZiBKUDEgKEdQSU9fU0NbNjJdKQ0KICAgICAgICAgIDExLCAxNCwNCiAgICAgICAgICAxMiwgMTYsICAgICAgLy8gUGluIDE2IG9mIEpQMSAoR1BJT19TQ1s2M10pDQogICAgICAgICAgMTMsIDE2LA0KICAgICAgICAgIDE0LCAxOCwgICAgICAvLyBQaW4gMTggb2YgSlAxIChHUElPX1NDWzY1XSkNCiAgICAgICAgICAxNSwgMTgsDQogICAgICAgICAgMTYsIDIwLCAgICAgIC8vIFBpbiAyMCBvZiBKUDEgKEdQSU9fU0NbNjRdKQ0KICAgICAgICAgIDE3LCAyMCwNCiAgICAgICAgICAxOCwgMjIsICAgICAgLy8gUGluIDIyIG9mIEpQMSAoR1BJT19TQ1s5NF0pDQogICAgICAgICAgMTksIDIyLA0KICAgICAgICAgIDIwLCAyNCwgICAgICAvLyBQaW4gMjQgb2YgSlAxIChHUElPX1NDWzk1XSkNCiAgICAgICAgICAyMSwgMjQsDQogICAgICAgICAgMjIsIDI2LCAgICAgIC8vIFBpbiAyNiBvZiBKUDEgKEdQSU9fU0NbNTRdKQ0KICAgICAgICAgIDIzLCAyNg0KICAgICAgICB9DQogICAgICB9IA0KICAgIH0NCiAgfSkNCiAgDQogIE1ldGhvZChfU1RBLDAsU2VyaWFsaXplZCkgew0KICAgIA0KICAgIC8vDQogICAgLy8gT25seSByZXBvcnQgSW9UIHZpcnR1YWwgZGV2aWNlIHdoZW4gYWxsIHBpbnMnIGNvbmZpZ3VyYXRpb24gZm9sbG93cyBNU0ZUJ3MgZGF0YXNoZWV0Lg0KICAgIC8vDQogICAgSWYgKExFcXVhbChJT1QsIDEpKSB7DQogICAgICBSZXR1cm4gKDB4RikNCiAgICB9DQogICAgDQogICAgUmV0dXJuICgweDApDQogIH0NCn0NCg==