LyoqIEBmaWxlDQogIEVGSSBVc2IgSS9PIFByb3RvY29sDQoNCiAgQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlICAgICAgICAgDQogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQgICAgICAgIA0KICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICBUSEUgUFJPR1JBTSBJUyBESVNUUklCVVRFRCBVTkRFUiBUSEUgQlNEIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgICAgICAgICAgICAgICAgICAgICANCiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4gICAgICAgICAgICAgDQoNCiAgTW9kdWxlIE5hbWU6ICBVc2JJby5oDQoNCioqLw0KDQojaWZuZGVmIF9fVVNCX0lPX0hfXw0KI2RlZmluZSBfX1VTQl9JT19IX18NCg0KLy8NCi8vIEdsb2JhbCBJRCBmb3IgdGhlIFVTQiBJL08gUHJvdG9jb2wNCi8vDQojZGVmaW5lIEVGSV9VU0JfSU9fUFJPVE9DT0xfR1VJRCBcDQogIHsgXA0KICAgIDB4MkIyRjY4RDYsIDB4MENEMiwgMHg0NGNmLCB7MHg4RSwgMHg4QiwgMHhCQiwgMHhBMiwgMHgwQiwgMHgxQiwgMHg1QiwgMHg3NSB9IFwNCiAgfQ0KDQp0eXBlZGVmIHN0cnVjdCBfRUZJX1VTQl9JT19QUk9UT0NPTCAgIEVGSV9VU0JfSU9fUFJPVE9DT0w7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEFzeW5jIFVTQiB0cmFuc2ZlciBjYWxsYmFjayByb3V0aW5lLg0KICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBEYXRhIHJlY2VpdmVkIG9yIHNlbnQgdmlhIHRoZSBVU0IgQXN5bmNocm9ub3VzIFRyYW5zZmVyLCBpZiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgRGF0YSByZWNlaXZlZCBvciBzZW50IHZpYSB0aGUgQXN5bmNocm9ub3VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyLCBpZiB0cmFuc2ZlciBzdWNjZXNzZnVsbHkgY29tcGxldGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDb250ZXh0ICAgICAgICAgICAgICAgRGF0YSBwYXNzZWQgZnJvbSBVc2JBc3luY0ludGVycnVwdFRyYW5zZmVyKCkgcmVxdWVzdC4NCiAgQHBhcmFtICBTdGF0dXMgICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jaHJvbm91cyB0cmFuc2Zlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBhc3luY2hyb25vdXMgVVNCIHRyYW5zZmVyIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLiAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBhc3luY2hyb25vdXMgVVNCIHRyYW5zZmVyIHJlcXVlc3QgZmFpbGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0FTWU5DX1VTQl9UUkFOU0ZFUl9DQUxMQkFDSykgKA0KICBJTiBWT0lEICAgICAgICAgKkRhdGEsDQogIElOIFVJTlROICAgICAgICBEYXRhTGVuZ3RoLA0KICBJTiBWT0lEICAgICAgICAgKkNvbnRleHQsDQogIElOIFVJTlQzMiAgICAgICBTdGF0dXMNCiAgKTsNCg0KLy8NCi8vIFByb3RvdHlwZSBmb3IgRUZJIFVTQiBJL08gcHJvdG9jb2wNCi8vDQoNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hbmFnZSBhIFVTQiBkZXZpY2Ugd2l0aCBhIGNvbnRyb2wgdHJhbnNmZXIgcGlwZS4gQSBjb250cm9sIHRyYW5zZmVyIGlzDQogIHR5cGljYWxseSB1c2VkIHRvIHBlcmZvcm0gZGV2aWNlIGluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBSZXF1ZXN0ICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBVU0IgZGV2aWNlIHJlcXVlc3QgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGlyZWN0aW9uICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgZGF0YSBkaXJlY3Rpb24uDQogIEBwYXJhbSAgRGF0YSAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIGRhdGEgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIHRvIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugb3IgcmVjZWl2ZWQgZnJvbSBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lb3V0ICAgICAgICAgICAgICAgSW5kaWNhdGluZyB0aGUgdHJhbnNmZXIgc2hvdWxkIGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhpcyB0aW1lIGZyYW1lLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdW5pdHMgYXJlIGluIG1pbGxpc2Vjb25kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhTGVuZ3RoICAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGF0YSBidWZmZXIgc3BlY2lmaWVkIGJ5IERhdGEuDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIHRoZSBVU0IgdHJhbnNmZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgY29udHJvbCB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSB0cmFuc2ZlciBmYWlsZWQuIFRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gU3RhdHVzLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFICBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLg0KICBAcmV0dmFsIEVGSV9USU1FT1VUICAgICAgICAgICBUaGUgY29udHJvbCB0cmFuc2ZlciBmYWlscyBkdWUgdG8gdGltZW91dC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fQ09OVFJPTF9UUkFOU0ZFUikgKA0KICBJTiBFRklfVVNCX0lPX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgKlRoaXMsDQogIElOIEVGSV9VU0JfREVWSUNFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAqUmVxdWVzdCwNCiAgSU4gRUZJX1VTQl9EQVRBX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiwNCiAgSU4gVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsDQogIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YSBPUFRJT05BTCwNCiAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGggIE9QVElPTkFMLA0KICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlN0YXR1cw0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFuYWdlIGEgVVNCIGRldmljZSB3aXRoIHRoZSBidWxrIHRyYW5zZmVyIHBpcGUuIEJ1bGsgVHJhbnNmZXJzIGFyZQ0KICB0eXBpY2FsbHkgdXNlZCB0byB0cmFuc2ZlciBsYXJnZSBhbW91bnRzIG9mIGRhdGEgdG8vZnJvbSBVU0IgZGV2aWNlcy4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGV2aWNlRW5kcG9pbnQgICAgICAgIEEgcG9pbnRlciB0byB0aGUgVVNCIGRldmljZSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGRhdGEgYnVmZmVyIHNwZWNpZmllZCBieSBEYXRhLg0KICBAcGFyYW0gIFRpbWVvdXQgICAgICAgICAgICAgICBJbmRpY2F0aW5nIHRoZSB0cmFuc2ZlciBzaG91bGQgYmUgY29tcGxldGVkIHdpdGhpbiB0aGlzIHRpbWUgZnJhbWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB1bml0cyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBTdGF0dXMgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBVU0IgdHJhbnNmZXIgc3RhdHVzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGJ1bGsgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdHJhbnNmZXIgZmFpbGVkLiBUaGUgdHJhbnNmZXIgc3RhdHVzIGlzIHJldHVybmVkIGluIFN0YXR1cy4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURSAgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIHN1Ym1pdHRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIGNvbnRyb2wgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIHRpbWVvdXQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0lPX0JVTEtfVFJBTlNGRVIpICgNCiAgSU4gRUZJX1VTQl9JT19QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRW5kcG9pbnQsDQogIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICpEYXRhTGVuZ3RoLA0KICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwNCiAgT1VUIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICpTdGF0dXMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hbmFnZSBhIFVTQiBkZXZpY2Ugd2l0aCBhbiBpbnRlcnJ1cHQgdHJhbnNmZXIgcGlwZS4gQW4gQXN5bmNocm9ub3VzICAgDQogIEludGVycnVwdCBUcmFuc2ZlciBpcyB0eXBpY2FsbHkgdXNlZCB0byBxdWVyeSBhIGRldmljZaGvcyBzdGF0dXMgYXQgYSBmaXhlZCByYXRlLiBGb3IgZXhhbXBsZSwgIA0KICBrZXlib2FyZCwgbW91c2UsIGFuZCBodWIgZGV2aWNlcyB1c2UgdGhpcyB0eXBlIG9mIHRyYW5zZmVyIHRvIHF1ZXJ5IHRoZWlyIGludGVycnVwdCBlbmRwb2ludHMgYXQNCiAgYSBmaXhlZCByYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9JT19QUk9UT0NPTCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERldmljZUVuZHBvaW50ICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIFVTQiBkZXZpY2UgcmVxdWVzdCB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgVVNCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBJc05ld1RyYW5zZmVyICAgICAgICAgSWYgVFJVRSwgYSBuZXcgdHJhbnNmZXIgd2lsbCBiZSBzdWJtaXR0ZWQgdG8gVVNCIGNvbnRyb2xsZXIuIElmICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIHRoZSBpbnRlcnJ1cHQgdHJhbnNmZXIgaXMgZGVsZXRlZCBmcm9tIHRoZSBkZXZpY2Whr3MgaW50ZXJydXB0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIHF1ZXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFBvbGxpbmdJbnRlcnZhbCAgICAgICBJbmRpY2F0ZXMgdGhlIHBlcmlvZGljIHJhdGUsIGluIG1pbGxpc2Vjb25kcywgdGhhdCB0aGUgdHJhbnNmZXIgaXMgdG8gYmUgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhTGVuZ3RoICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgZGF0YSB0byBiZSByZWNlaXZlZCBmcm9tIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQ29udGV4dCAgICAgICAgICAgICAgIERhdGEgcGFzc2VkIHRvIHRoZSBJbnRlcnJ1cHRDYWxsYmFjayBmdW5jdGlvbi4NCiAgQHBhcmFtICBJbnRlcnJ1cHRDYWxsYmFjayAgICAgVGhlIENhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB0aGUgYXN5bmNocm9ub3VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYXN5bmNocm9ub3VzIFVTQiB0cmFuc2ZlciByZXF1ZXN0IHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGFzeW5jaHJvbm91cyBVU0IgdHJhbnNmZXIgcmVxdWVzdCBmYWlsZWQuICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0lPX0FTWU5DX0lOVEVSUlVQVF9UUkFOU0ZFUikgKA0KICBJTiBFRklfVVNCX0lPX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRoaXMsDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VFbmRwb2ludCwNCiAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTmV3VHJhbnNmZXIsDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xsaW5nSW50ZXJ2YWwgICAgT1BUSU9OQUwsDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoICAgICAgICAgT1BUSU9OQUwsDQogIElOIEVGSV9BU1lOQ19VU0JfVFJBTlNGRVJfQ0FMTEJBQ0sgICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRDYWxsQmFjayAgT1BUSU9OQUwsDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ29udGV4dCBPUFRJT05BTA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFuYWdlIGEgVVNCIGRldmljZSB3aXRoIGFuIGludGVycnVwdCB0cmFuc2ZlciBwaXBlLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEZXZpY2VFbmRwb2ludCAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBVU0IgZGV2aWNlIHJlcXVlc3QgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YSAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIGRhdGEgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIHRvIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugb3IgcmVjZWl2ZWQgZnJvbSBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhTGVuZ3RoICAgICAgICAgICAgT24gaW5wdXQsIHRoZW4gc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgRGF0YS4gT24gb3V0cHV0LCB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgdHJhbnNmZXJyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lb3V0ICAgICAgICAgICAgICAgVGhlIHRpbWUgb3V0LCBpbiBzZWNvbmRzLCBmb3IgdGhpcyB0cmFuc2Zlci4NCiAgQHBhcmFtICBTdGF0dXMgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBVU0IgdHJhbnNmZXIgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgc3luYyBpbnRlcnJ1cHQgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgc3luYyBpbnRlcnJ1cHQgdHJhbnNmZXIgcmVxdWVzdCBmYWlsZWQuICAgDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIFRoZSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gdGltZW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fU1lOQ19JTlRFUlJVUFRfVFJBTlNGRVIpICgNCiAgSU4gRUZJX1VTQl9JT19QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRW5kcG9pbnQsDQogIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICpEYXRhTGVuZ3RoLA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwNCiAgT1VUICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICpTdGF0dXMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1hbmFnZSBhIFVTQiBkZXZpY2Ugd2l0aCBhbiBpc29jaHJvbm91cyB0cmFuc2ZlciBwaXBlLiBBbiBJc29jaHJvbm91cw0KICB0cmFuc2ZlciBpcyB0eXBpY2FsbHkgdXNlZCB0byB0cmFuc2ZlciBzdHJlYW1pbmcgZGF0YS4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGV2aWNlRW5kcG9pbnQgICAgICAgIEEgcG9pbnRlciB0byB0aGUgVVNCIGRldmljZSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGRhdGEgYnVmZmVyIHNwZWNpZmllZCBieSBEYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgU3RhdHVzICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgVVNCIHRyYW5zZmVyIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGhlIHBhcmFtZXRlciBEZXZpY2VFbmRwb2ludCBpcyBub3QgdmFsaWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSB0cmFuc2ZlciBmYWlsZWQgZHVlIHRvIHRoZSByZWFzb24gb3RoZXIgdGhhbiB0aW1lb3V0LCBUaGUgZXJyb3Igc3RhdHVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkIGluIFN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIFRoZSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gdGltZW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fSVNPQ0hST05PVVNfVFJBTlNGRVIpICgNCiAgSU4gRUZJX1VTQl9JT19QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRW5kcG9pbnQsDQogIElOIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGgsDQogIE9VVCAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAqU3RhdHVzDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYW5hZ2UgYSBVU0IgZGV2aWNlIHdpdGggYW4gaXNvY2hyb25vdXMgdHJhbnNmZXIgcGlwZS4gQW4gSXNvY2hyb25vdXMNCiAgdHJhbnNmZXIgaXMgdHlwaWNhbGx5IHVzZWQgdG8gdHJhbnNmZXIgc3RyZWFtaW5nIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0lPX1BST1RPQ09MIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGV2aWNlRW5kcG9pbnQgICAgICAgIEEgcG9pbnRlciB0byB0aGUgVVNCIGRldmljZSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGRhdGEgYnVmZmVyIHNwZWNpZmllZCBieSBEYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQ29udGV4dCAgICAgICAgICAgICAgIERhdGEgcGFzc2VkIHRvIHRoZSBJc29jaHJvbm91c0NhbGxiYWNrKCkgZnVuY3Rpb24uDQogIEBwYXJhbSAgSXNvY2hyb25vdXNDYWxsYmFjayAgIFRoZSBJc29jaHJvbm91c0NhbGxiYWNrKCkgZnVuY3Rpb24uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYXN5bmNocm9ub3VzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN5c3RlbS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGhlIHBhcmFtZXRlciBEZXZpY2VFbmRwb2ludCBpcyBub3QgdmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fQVNZTkNfSVNPQ0hST05PVVNfVFJBTlNGRVIpICgNCiAgSU4gRUZJX1VTQl9JT19QUk9UT0NPTCAgICAgICAgICAgICAgKlRoaXMsDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUVuZHBvaW50LA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCwNCiAgSU4gRUZJX0FTWU5DX1VTQl9UUkFOU0ZFUl9DQUxMQkFDSyAgSXNvY2hyb25vdXNDYWxsQmFjaywNCiAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkNvbnRleHQgT1BUSU9OQUwNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmVzZXRzIGFuZCByZWNvbmZpZ3VyZXMgdGhlIFVTQiBjb250cm9sbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgd29yayBmb3IgYWxsIFVTQiBkZXZpY2VzIGV4Y2VwdA0KICBVU0IgSHViIENvbnRyb2xsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9JT19QUk9UT0NPTCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgVVNCIGNvbnRyb2xsZXIgd2FzIHJlc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIElmIHRoZSBjb250cm9sbGVyIHNwZWNpZmllZCBieSBUaGlzIGlzIGEgVVNCIGh1Yi4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSByZWNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VTQl9JT19QT1JUX1JFU0VUKSAoDQogIElOIEVGSV9VU0JfSU9fUFJPVE9DT0wgICAgKlRoaXMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0cmlldmVzIHRoZSBVU0IgRGV2aWNlIERlc2NyaXB0b3IuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9JT19QUk9UT0NPTCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGV2aWNlRGVzY3JpcHRvciAgICAgIEEgcG9pbnRlciB0byB0aGUgY2FsbGVyIGFsbG9jYXRlZCBVU0IgRGV2aWNlIERlc2NyaXB0b3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZGV2aWNlIGRlc2NyaXB0b3Igd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIERldmljZURlc2NyaXB0b3IgaXMgTlVMTC4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIGRldmljZSBkZXNjcmlwdG9yIHdhcyBub3QgZm91bmQuIFRoZSBkZXZpY2UgbWF5IG5vdCBiZSBjb25maWd1cmVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0lPX0dFVF9ERVZJQ0VfREVTQ1JJUFRPUikgKA0KICBJTiBFRklfVVNCX0lPX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsDQogIE9VVCBFRklfVVNCX0RFVklDRV9ERVNDUklQVE9SICAgICAqRGV2aWNlRGVzY3JpcHRvcg0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXRyaWV2ZXMgdGhlIFVTQiBEZXZpY2UgRGVzY3JpcHRvci4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIENvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIEEgcG9pbnRlciB0byB0aGUgY2FsbGVyIGFsbG9jYXRlZCBVU0IgQWN0aXZlIENvbmZpZ3VyYXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgVGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3Igd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgaXMgTlVMTC4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgICBBbiBhY3RpdmUgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGNhbm5vdCBiZSBmb3VuZC4gVGhlIGRldmljZSBtYXkgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29uZmlndXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0lPX0dFVF9DT05GSUdfREVTQ1JJUFRPUikgKA0KICBJTiBFRklfVVNCX0lPX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsDQogIE9VVCBFRklfVVNCX0NPTkZJR19ERVNDUklQVE9SICAgICAqQ29uZmlndXJhdGlvbkRlc2NyaXB0b3INCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0cmlldmVzIHRoZSBJbnRlcmZhY2UgRGVzY3JpcHRvciBmb3IgYSBVU0IgRGV2aWNlIENvbnRyb2xsZXIuIEFzIHN0YXRlZCBlYXJsaWVyLCBhbiBpbnRlcmZhY2UNCiAgd2l0aGluIGEgVVNCIGRldmljZSBpcyBlcXVpdmFsZW50bHkgdG8gYSBVU0IgQ29udHJvbGxlciB3aXRoaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gICAgICANCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEludGVyZmFjZURlc2NyaXB0b3IgICAgIEEgcG9pbnRlciB0byB0aGUgY2FsbGVyIGFsbG9jYXRlZCBVU0IgSW50ZXJmYWNlIERlc2NyaXB0b3Igd2l0aGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgICBJbnRlcmZhY2VEZXNjcmlwdG9yIGlzIE5VTEwuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgICAgVGhlIGludGVyZmFjZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSBmb3VuZC4gVGhlIGRldmljZSBtYXkgbm90IGJlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IGNvbmZpZ3VyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fR0VUX0lOVEVSRkFDRV9ERVNDUklQVE9SKSAoDQogIElOIEVGSV9VU0JfSU9fUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgT1VUIEVGSV9VU0JfSU5URVJGQUNFX0RFU0NSSVBUT1IgICpJbnRlcmZhY2VEZXNjcmlwdG9yDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHJpZXZlcyBhbiBFbmRwb2ludCBEZXNjcmlwdG9yIHdpdGhpbiBhIFVTQiBDb250cm9sbGVyLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9JT19QUk9UT0NPTCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRW5kcG9pbnRJbmRleCAgICAgICAgICAgSW5kaWNhdGVzIHdoaWNoIGVuZHBvaW50IGRlc2NyaXB0b3IgdG8gcmV0cmlldmUuDQogIEBwYXJhbSAgRW5kcG9pbnREZXNjcmlwdG9yICAgICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsZXIgYWxsb2NhdGVkIFVTQiBFbmRwb2ludCBEZXNjcmlwdG9yIG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBVU0IgY29udHJvbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgVGhlIGVuZHBvaW50IGRlc2NyaXB0b3Igd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgICBUaGUgZW5kcG9pbnQgZGVzY3JpcHRvciBjYW5ub3QgYmUgZm91bmQuIFRoZSBkZXZpY2UgbWF5IG5vdCBiZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RseSBjb25maWd1cmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fR0VUX0VORFBPSU5UX0RFU0NSSVBUT1IpICgNCiAgSU4gRUZJX1VTQl9JT19QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRJbmRleCwNCiAgT1VUIEVGSV9VU0JfRU5EUE9JTlRfREVTQ1JJUFRPUiAgICpFbmRwb2ludERlc2NyaXB0b3INCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0cmlldmVzIGEgVW5pY29kZSBzdHJpbmcgc3RvcmVkIGluIGEgVVNCIERldmljZS4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIExhbmdJRCAgICAgICAgICAgICAgICAgIFRoZSBMYW5ndWFnZSBJRCBmb3IgdGhlIHN0cmluZyBiZWluZyByZXRyaWV2ZWQuDQogIEBwYXJhbSAgU3RyaW5nSUQgICAgICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBzdHJpbmcgYmVpbmcgcmV0cmlldmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFN0cmluZyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhpcyBmdW5jdGlvbiB3aXRoICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlUG9vbCgpIHRvIHN0b3JlIHRoZSBzdHJpbmcuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICAgVGhlIHN0cmluZyB3YXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS4gIA0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICAgIFRoZSBzdHJpbmcgc3BlY2lmaWVkIGJ5IExhbmdJRCBhbmQgU3RyaW5nSUQgd2FzIG5vdCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICAgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBhbGxvY2F0ZSB0aGUgcmV0dXJuIGJ1ZmZlciBTdHJpbmcuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSU9fR0VUX1NUUklOR19ERVNDUklQVE9SKSAoDQogIElOIEVGSV9VU0JfSU9fUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgSU4gIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIExhbmdJRCwNCiAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0lELA0KICBPVVQgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgKipTdHJpbmcNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0cmlldmVzIGFsbCB0aGUgbGFuZ3VhZ2UgSUQgY29kZXMgdGhhdCB0aGUgVVNCIGRldmljZSBzdXBwb3J0cy4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSU9fUFJPVE9DT0wgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIExhbmdJRFRhYmxlICAgICAgICAgICAgIExhbmd1YWdlIElEIGZvciB0aGUgc3RyaW5nIHRoZSBjYWxsZXIgd2FudHMgdG8gZ2V0Lg0KICBAcGFyYW0gIFRhYmxlU2l6ZSAgICAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHRhYmxlIExhbmdJRFRhYmxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAgIFRoZSBzdXBwb3J0IGxhbmd1YWdlcyB3ZXJlIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VTQl9JT19HRVRfU1VQUE9SVEVEX0xBTkdVQUdFKSAoDQogIElOIEVGSV9VU0JfSU9fUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgT1VUIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICoqTGFuZ0lEVGFibGUsDQogIE9VVCBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVTaXplDQogICk7DQoNCi8vDQovLyAgUHJvdG9jb2wgSW50ZXJmYWNlIFN0cnVjdHVyZQ0KLy8NCnN0cnVjdCBfRUZJX1VTQl9JT19QUk9UT0NPTCB7DQogIC8vDQogIC8vIElPIHRyYW5zZmVyDQogIC8vDQogIEVGSV9VU0JfSU9fQ09OVFJPTF9UUkFOU0ZFUiAgICAgICAgICAgVXNiQ29udHJvbFRyYW5zZmVyOw0KICBFRklfVVNCX0lPX0JVTEtfVFJBTlNGRVIgICAgICAgICAgICAgIFVzYkJ1bGtUcmFuc2ZlcjsNCiAgRUZJX1VTQl9JT19BU1lOQ19JTlRFUlJVUFRfVFJBTlNGRVIgICBVc2JBc3luY0ludGVycnVwdFRyYW5zZmVyOw0KICBFRklfVVNCX0lPX1NZTkNfSU5URVJSVVBUX1RSQU5TRkVSICAgIFVzYlN5bmNJbnRlcnJ1cHRUcmFuc2ZlcjsNCiAgRUZJX1VTQl9JT19JU09DSFJPTk9VU19UUkFOU0ZFUiAgICAgICBVc2JJc29jaHJvbm91c1RyYW5zZmVyOw0KICBFRklfVVNCX0lPX0FTWU5DX0lTT0NIUk9OT1VTX1RSQU5TRkVSIFVzYkFzeW5jSXNvY2hyb25vdXNUcmFuc2ZlcjsNCg0KICAvLw0KICAvLyBDb21tb24gZGV2aWNlIHJlcXVlc3QNCiAgLy8NCiAgRUZJX1VTQl9JT19HRVRfREVWSUNFX0RFU0NSSVBUT1IgICAgICBVc2JHZXREZXZpY2VEZXNjcmlwdG9yOw0KICBFRklfVVNCX0lPX0dFVF9DT05GSUdfREVTQ1JJUFRPUiAgICAgIFVzYkdldENvbmZpZ0Rlc2NyaXB0b3I7DQogIEVGSV9VU0JfSU9fR0VUX0lOVEVSRkFDRV9ERVNDUklQVE9SICAgVXNiR2V0SW50ZXJmYWNlRGVzY3JpcHRvcjsNCiAgRUZJX1VTQl9JT19HRVRfRU5EUE9JTlRfREVTQ1JJUFRPUiAgICBVc2JHZXRFbmRwb2ludERlc2NyaXB0b3I7DQogIEVGSV9VU0JfSU9fR0VUX1NUUklOR19ERVNDUklQVE9SICAgICAgVXNiR2V0U3RyaW5nRGVzY3JpcHRvcjsNCiAgRUZJX1VTQl9JT19HRVRfU1VQUE9SVEVEX0xBTkdVQUdFICAgICBVc2JHZXRTdXBwb3J0ZWRMYW5ndWFnZXM7DQoNCiAgLy8NCiAgLy8gUmVzZXQgY29udHJvbGxlcidzIHBhcmVudCBwb3J0DQogIC8vDQogIEVGSV9VU0JfSU9fUE9SVF9SRVNFVCAgICAgICAgICAgICAgICAgVXNiUG9ydFJlc2V0Ow0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlVc2JJb1Byb3RvY29sR3VpZDsNCg0KI2VuZGlmDQo=