LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqDQogKiBcZmlsZQ0KICoNCiAqIEltcGxlbWVudGF0aW9uIG9mIG1lbW9yaWVzIGNvbmZpZ3VyYXRpb24gb24gYm9hcmQuDQogKg0KICovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgIEhlYWRlcnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiYm9hcmQuaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojZGVmaW5lIFNEUkFNX0JBMCAoMSA8PCAyMCkNCiNkZWZpbmUgU0RSQU1fQkExICgxIDw8IDIxKQ0KDQoNCnVpbnQzMl90IEJPQVJEX1NkcmFtVmFsaWRhdGlvbih1aW50MzJfdCBiYXNlQWRkciwgdWludDMyX3Qgc2l6ZSkNCnsNCgl1aW50MzJfdCBpOw0KCXVpbnQzMl90IHJldCA9IDE7DQoJdWludDMyX3QgKnB0cjMyID0gKHVpbnQzMl90ICopIGJhc2VBZGRyOw0KCXVpbnQxNl90ICpwdHIxNiA9ICh1aW50MTZfdCAqKSBiYXNlQWRkcjsNCgl1aW50OF90ICpwdHI4ID0gKHVpbnQ4X3QgKikgYmFzZUFkZHI7DQoJLyogVGVzdCBmb3IgNTVBQTU1QUEvQUE1NUFBNTUgcGF0dGVybiAqLw0KCXByaW50ZigiIFRlc3QgZm9yIDU1QUE1NUFBL0FBNTVBQTU1IHBhdHRlcm4gLi4uIFxuXHIiKTsNCglmb3IgKGkgPSAwOyBpIDwgc2l6ZSA7IGkgKyspIHsNCgkJaWYgKGkgJiAxKSB7DQoJCQlwdHIzMltpXSA9IDB4NTVBQTU1QUEgOw0KCQl9IGVsc2Ugew0KCQkJcHRyMzJbaV0gPSAweEFBNTVBQTU1IDsNCgkJfQ0KCQltZW1vcnlfYmFycmllcigpIA0KCX0NCglmb3IgKGkgPSAwOyBpIDwgIHNpemUgOyBpKyspIHsNCgkJaWYgKGkgJiAxKSB7DQoJCQlpZiAocHRyMzJbaV0gIT0gMHg1NUFBNTVBQSApIHsNCgkJCQlwcmludGYoIi1FLSBFeHBlY3RlZDoleCwgcmVhZCAleCBAICV4IFxuXHIiICwNCgkJCQkJMHhBQTU1QUE1NSwgKHVuc2lnbmVkKXB0cjMyW2ldLCAodW5zaWduZWQpKGJhc2VBZGRyICsgaSkpOw0KCQkJCXJldCA9IDA7DQoJCQkJDQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlpZiAocHRyMzJbaV0gIT0gMHhBQTU1QUE1NSApIHsNCgkJCQlwcmludGYoIi1FLSBFeHBlY3RlZDoleCwgcmVhZCAleCBAICV4IFxuXHIiICwNCgkJCQkJCTB4QUE1NUFBNTUgLCAodW5zaWduZWQpcHRyMzJbaV0sICh1bnNpZ25lZCkoYmFzZUFkZHIgKyBpKSk7DQoJCQkJcmV0ID0gMDsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoIXJldCkgcmV0dXJuIHJldDsNCglwcmludGYoIiBUZXN0IGZvciBCWVRFIGFjY2Vzc2luZy4uLiBcblxyIik7DQoJLyogVGVzdCBmb3IgQllURSBhY2Nlc3NpbmcgKi8NCglmb3IgKGkgPSAwOyBpIDwgc2l6ZSA7IGkgKyspIHsNCgkJcHRyOFtpXSA9ICh1aW50OF90KSggaSAmIDB4RkYpIDsNCgl9DQoJDQoJZm9yIChpID0gMDsgaSA8ICBzaXplIDsgaSsrKSB7DQoJCWlmIChwdHI4W2ldICE9ICh1aW50OF90KShpICYgMHhGRikpICB7DQoJCQlwcmludGYoIi1FLSBFeHBlY3RlZDoleCwgcmVhZCAleCBAICV4IFxuXHIiICwNCgkJCQkodW5zaWduZWQpKGkgJiAweEZGKSwgcHRyOFtpXSwodW5zaWduZWQpKGJhc2VBZGRyICsgaSkpOw0KCQkJcmV0ID0gMDsNCgkJfQ0KCX0NCglpZiAoIXJldCkgcmV0dXJuIHJldDsNCgkNCglwcmludGYoIiBUZXN0IGZvciBXT1JEIGFjY2Vzc2luZy4uLiBcblxyIik7DQoJLyogVGVzdCBmb3IgV09SRCBhY2Nlc3NpbmcgKi8NCglmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIDIgOyBpICsrKSB7DQoJCXB0cjE2W2ldID0gKHVpbnQxNl90KSggaSAmIDB4RkZGRikgOw0KCX0NCgkNCglmb3IgKGkgPSAwOyBpIDwgIHNpemUgLyAyIDsgaSsrKSB7DQoJCWlmIChwdHIxNltpXSAhPSAodWludDE2X3QpKGkgJiAweEZGRkYpKSAgew0KCQkJcHJpbnRmKCItRS0gRXhwZWN0ZWQ6JXgsIHJlYWQgJXggQCAleCBcblxyIiAsDQoJCQkJKHVuc2lnbmVkKShpICYgMHhGRkZGKSwgcHRyMTZbaV0sKHVuc2lnbmVkKShiYXNlQWRkciArIGkpKTsNCgkJCXJldCA9IDA7DQoJCX0NCgl9DQoJaWYgKCFyZXQpIHJldHVybiByZXQ7DQoJcHJpbnRmKCIgVGVzdCBmb3IgRFdPUkQgYWNjZXNzaW5nLi4uIFxuXHIiKTsNCgkvKiBUZXN0IGZvciBEV09SRCBhY2Nlc3NpbmcgKi8NCglmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIDQgOyBpICsrKSB7DQoJCXB0cjMyW2ldID0gKHVpbnQzMl90KSggaSAmIDB4RkZGRkZGRkYpIDsNCgkJbWVtb3J5X2JhcnJpZXIoKSANCgl9DQoJDQoJZm9yIChpID0gMDsgaSA8ICBzaXplIC8gNCA7IGkrKykgew0KCQlpZiAocHRyMzJbaV0gIT0gKHVpbnQzMl90KShpICYgMHhGRkZGRkZGRikpICB7DQoJCQlwcmludGYoIi1FLSBFeHBlY3RlZDoleCwgcmVhZCAleCBAICV4IFxuXHIiICwNCgkJCQkodW5zaWduZWQpKGkgJiAweEZGRkZGRkZGKSwgKHVuc2lnbmVkKXB0cjMyW2ldLCAodW5zaWduZWQpKGJhc2VBZGRyICsgaSkpOw0KCQkJcmV0ID0gMDsNCgkJfQ0KCX0NCglyZXR1cm4gcmV0Ow0KfQ0KDQoNCi8qKg0KICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIEVCSSBmb3IgU0RSQU0gKElTNDJTMTYxMDBFLTdCKSBhY2Nlc3MuDQogKi8NCg0KDQp2b2lkIEJPQVJEX0NvbmZpZ3VyZVNkcmFtKCB2b2lkICkNCnsNCgljb25zdCBQaW4gcGluc1NkcmFtW10gPSB7Qk9BUkRfU0RSQU1fUElOU307DQoJdm9sYXRpbGUgdWludDMyX3QgaTsNCgl2b2xhdGlsZSB1aW50OF90ICpwU2RyYW0gPSAodWludDhfdCAqKSBTRFJBTV9DU19BRERSOw0KDQoJLyogQ29uZmlndXJlIFBJTyAqLw0KCVBJT19Db25maWd1cmUocGluc1NkcmFtLCBQSU9fTElTVFNJWkUocGluc1NkcmFtKSk7DQoJUE1DX0VuYWJsZVBlcmlwaGVyYWwoSURfU0RSQU1DKTsNCglNQVRSSVgtPkNDRkdfU01DTkZDUyA9IENDRkdfU01DTkZDU19TRFJBTUVOOw0KDQoJLyogMS4gU0RSQU0gZmVhdHVyZXMgbXVzdCBiZSBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXI6IA0KCWFzeW5jaHJvbm91cyB0aW1pbmdzIChUUkMsIFRSQVMsIGV0Yy4pLCBudW1iZXIgb2YgY29sdW1ucywgcm93cywgDQoJQ0FTIGxhdGVuY3ksIGFuZCB0aGUgZGF0YSBidXMgd2lkdGguICovDQoJU0RSQU1DLT5TRFJBTUNfQ1IgPSANCgkJICBTRFJBTUNfQ1JfTkNfQ09MOCAgICAgIC8vIDggY29sdW1uIGJpdHMgDQoJCXwgU0RSQU1DX0NSX05SX1JPVzExICAgICAvLyAxMiByb3cgYml0cyAoNEspDQoJCXwgU0RSQU1DX0NSX0NBU19MQVRFTkNZMyAvLyBDQVMgTGF0ZW5jeSAzDQoJCXwgU0RSQU1DX0NSX05CX0JBTksyICAgICAvLyAyIGJhbmtzDQoJCXwgU0RSQU1DX0NSX0RCVyAgICAgICAgICAvLyAxNiBiaXQNCgkJfCBTRFJBTUNfQ1JfVFdSKDQpDQoJCXwgU0RSQU1DX0NSX1RSQ19UUkZDKDExKSAvLyA2M25zICAgbWluDQoJCXwgU0RSQU1DX0NSX1RSUCg1KSAgICAgICAvLyBDb21tYW5kIHBlcmlvZCAoUFJFIHRvIEFDVCkgMjEgbnMgbWluDQoJCXwgU0RSQU1DX0NSX1RSQ0QoNSkgICAgICAvLyBBY3RpdmUgQ29tbWFuZCB0byByZWFkL1dyaXRlIENvbW1hbmQgZGVsYXkgdGltZSAyMW5zIG1pbiANCgkJfCBTRFJBTUNfQ1JfVFJBUyg4KSAgICAgIC8vIENvbW1hbmQgcGVyaW9kIChBQ1QgdG8gUFJFKSAgNDJucyBtaW4gDQoJCXwgU0RSQU1DX0NSX1RYU1IoMTNVKTsgICAvLyBFeGl0IHNlbGYtcmVmcmVzaCB0byBhY3RpdmUgdGltZSAgNzBucyBNaW4NCg0KCS8qIDIuIEZvciBtb2JpbGUgU0RSQU0sIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIHNlbGYgcmVmcmVzaCAoVENTUiksIGRyaXZlDQoJc3RyZW5ndGggKERTKSBhbmQgcGFydGlhbCBhcnJheSBzZWxmIHJlZnJlc2ggKFBBU1IpIG11c3QgYmUgc2V0IGluIHRoZQ0KCUxvdyBQb3dlciBSZWdpc3Rlci4gKi8NCg0KCS8qIDMuIFRoZSBTRFJBTSBtZW1vcnkgdHlwZSBtdXN0IGJlIHNldCBpbiB0aGUgTWVtb3J5IERldmljZSBSZWdpc3Rlci4qLw0KCVNEUkFNQy0+U0RSQU1DX01EUiA9IFNEUkFNQ19NRFJfTURfU0RSQU07DQoNCgkvKiA0LiBBIG1pbmltdW0gcGF1c2Ugb2YgMjAwIKbMcyBpcyBwcm92aWRlZCB0byBwcmVjZWRlIGFueSBzaWduYWwgdG9nZ2xlLiovDQoJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCg0KCS8qIDUuICgxKUEgTk9QIGNvbW1hbmQgaXMgaXNzdWVkIHRvIHRoZSBTRFJBTSBkZXZpY2VzLiBUaGUgYXBwbGljYXRpb24gbXVzdA0KCXNldCBNb2RlIHRvIDEgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MgdG8NCglhbnkgU0RSQU0gYWRkcmVzcy4qLw0KCVNEUkFNQy0+U0RSQU1DX01SID0gU0RSQU1DX01SX01PREVfTk9QOw0KCSpwU2RyYW0gPSAwOw0KCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKyk7DQoJLyogNi4gQW4gQWxsIEJhbmtzIFByZWNoYXJnZSBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgU0RSQU0gZGV2aWNlcy4NCglUaGUgYXBwbGljYXRpb24gbXVzdCBzZXQgTW9kZSB0byAyIGluIHRoZSBNb2RlIFJlZ2lzdGVyIGFuZCBwZXJmb3JtIGEgd3JpdGUNCglhY2Nlc3MgdG8gYW55IFNEUkFNIGFkZHJlc3MuICovDQoJU0RSQU1DLT5TRFJBTUNfTVIgPSBTRFJBTUNfTVJfTU9ERV9BTExCQU5LU19QUkVDSEFSR0U7DQoJKnBTZHJhbSA9IDA7DQoJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCgkvKiA3LiBFaWdodCBhdXRvLXJlZnJlc2ggKENCUikgY3ljbGVzIGFyZSBwcm92aWRlZC4gVGhlIGFwcGxpY2F0aW9uIG11c3QNCglzZXQgdGhlIE1vZGUgdG8gNCBpbiB0aGUgTW9kZSBSZWdpc3RlciBhbmQgcGVyZm9ybSBhIHdyaXRlIGFjY2VzcyB0byBhbnkNCglTRFJBTSBsb2NhdGlvbiBlaWdodCB0aW1lcy4qLw0KCWZvciAoaSA9IDAgOyBpPCA4OyBpKyspIHsNCgkJU0RSQU1DLT5TRFJBTUNfTVIgPSBTRFJBTUNfTVJfTU9ERV9BVVRPX1JFRlJFU0g7DQoJCSpwU2RyYW0gPSAwOw0KCX0NCglmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspOw0KCS8qOC4gQSBNb2RlIFJlZ2lzdGVyIHNldCAoTVJTKSBjeWNsZSBpcyBpc3N1ZWQgdG8gcHJvZ3JhbSB0aGUgcGFyYW1ldGVycyBvZg0KCXRoZSBTRFJBTSBkZXZpY2VzLCBpbiBwYXJ0aWN1bGFyIENBUyBsYXRlbmN5IGFuZCBidXJzdCBsZW5ndGguIFRoZSANCglhcHBsaWNhdGlvbiBtdXN0IHNldCBNb2RlIHRvIDMgaW4gdGhlIE1vZGUgUmVnaXN0ZXIgYW5kIHBlcmZvcm0gYSB3cml0ZQ0KCWFjY2VzcyB0byB0aGUgU0RSQU0uIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMTowXSANCglhcmUgc2V0IHRvIDAuIEZvciBleGFtcGxlLCB3aXRoIGEgMTYtYml0IDEyOCBNQiBTRFJBTSAoMTIgcm93cywgOSBjb2x1bW5zLA0KCTQgYmFua3MpIGJhbmsgYWRkcmVzcywgdGhlIFNEUkFNIHdyaXRlIGFjY2VzcyBzaG91bGQgYmUgZG9uZSBhdCB0aGUgYWRkcmVzcw0KCTB4NzAwMDAwMDAuKi8NCglTRFJBTUMtPlNEUkFNQ19NUiA9IFNEUkFNQ19NUl9NT0RFX0xPQURfTU9ERVJFRzsNCgkqcFNkcmFtID0gMDsNCg0KCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKyk7DQoJLyo5LiBGb3IgbW9iaWxlIFNEUkFNIGluaXRpYWxpemF0aW9uLCBhbiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIHNldCAoRU1SUykgDQoJY3ljbGUgaXMgaXNzdWVkIHRvIHByb2dyYW0gdGhlIFNEUkFNIHBhcmFtZXRlcnMgKFRDU1IsIFBBU1IsIERTKS4gVGhlIA0KCWFwcGxpY2F0aW9uIG11c3Qgc2V0IE1vZGUgdG8gNSBpbiB0aGUgTW9kZSBSZWdpc3RlciBhbmQgcGVyZm9ybSBhIHdyaXRlIA0KCWFjY2VzcyB0byB0aGUgU0RSQU0uIFRoZSB3cml0ZSBhZGRyZXNzIG11c3QgYmUgY2hvc2VuIHNvIHRoYXQgQkFbMV0gb3IgQkFbMF0NCglhcmUgc2V0IHRvIDEuDQoJRm9yIGV4YW1wbGUsIHdpdGggYSAxNi1iaXQgMTI4IE1CIFNEUkFNLCAoMTIgcm93cywgOSBjb2x1bW5zLCA0IGJhbmtzKSBiYW5rDQoJYWRkcmVzcyB0aGUgU0RSQU0gd3JpdGUgYWNjZXNzIHNob3VsZCBiZSBkb25lIGF0IHRoZSBhZGRyZXNzIDB4NzA4MDAwMDAgb3IgDQoJMHg3MDQwMDAwMC4gKi8NCgkvL1NEUkFNQy0+U0RSQU1DX01SID0gU0RSQU1DX01SX01PREVfRVhUX0xPQURfTU9ERVJFRzsNCgkvLyAqKCh1aW50OF90ICopKHBTZHJhbSArIFNEUkFNX0JBMCkpID0gMDsNCg0KCS8qIDEwLiBUaGUgYXBwbGljYXRpb24gbXVzdCBnbyBpbnRvIE5vcm1hbCBNb2RlLCBzZXR0aW5nIE1vZGUgdG8gMCBpbiB0aGUNCglNb2RlIFJlZ2lzdGVyIGFuZCBwZXJmb3JtaW5nIGEgd3JpdGUgYWNjZXNzIGF0IGFueSBsb2NhdGlvbiBpbiB0aGUgU0RSQU0uICovDQoJU0RSQU1DLT5TRFJBTUNfTVIgPSBTRFJBTUNfTVJfTU9ERV9OT1JNQUw7DQoJKnBTZHJhbSA9IDA7DQoJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKTsNCgkvKiAxMS4gV3JpdGUgdGhlIHJlZnJlc2ggcmF0ZSBpbnRvIHRoZSBjb3VudCBmaWVsZCBpbiB0aGUgU0RSQU1DIFJlZnJlc2gNCglUaW1lciByZWdpc3Rlci4gKFJlZnJlc2ggcmF0ZSA9IGRlbGF5IGJldHdlZW4gcmVmcmVzaCBjeWNsZXMpLiANCglUaGUgU0RSQU0gZGV2aWNlIHJlcXVpcmVzIGEgcmVmcmVzaCBldmVyeSAxNS42MjUgpsxzIG9yIDcuODEgpsxzLg0KCVdpdGggYSAxMDAgTUh6IGZyZXF1ZW5jeSwgdGhlIFJlZnJlc2ggVGltZXIgQ291bnRlciBSZWdpc3RlciBtdXN0IGJlIHNldA0KCXdpdGggdGhlIHZhbHVlIDE1NjIoMTUuNjI1IKbMcyB4IDEwMCBNSHopIG9yIDc4MSg3LjgxIKbMcyB4IDEwMCBNSHopLiAqLw0KCS8vIEZvciBJUzQyUzE2MTAwRSwgMjA0OCByZWZyZXNoIGN5Y2xlIGV2ZXJ5IDMybXMsIGV2ZXJ5IDE1LjYyNSCmzHMNCgkvKiAoKDMyIHggMTAoXi0zKSkvMjA0OCkgeDE1MCB4ICgxMF42KSAqLw0KCVNEUkFNQy0+U0RSQU1DX1RSID0gMjM0MzsgOw0KCVNEUkFNQy0+U0RSQU1DX0NGUjEgfD0gU0RSQU1DX0NGUjFfVU5BTDsNCgkvKiBBZnRlciBpbml0aWFsaXphdGlvbiwgdGhlIFNEUkFNIGRldmljZXMgYXJlIGZ1bGx5IGZ1bmN0aW9uYWwuICovDQp9DQo=