LyogVHJhbnNwb3J0ICYgUHJvdG9jb2wgRHJpdmVyIGZvciBJbi1TeXN0ZW0gRGVzaWduLCBJbmMuIElTRDIwMCBBU0lDCiAqCiAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlOgogKiAgIChDKSAyMDAxLTIwMDIgQmrDtnJuIFN0ZW5iZXJnIChiam9ybkBoYXh4LnNlKQogKgogKiBEZXZlbG9wZWQgd2l0aCB0aGUgYXNzaXN0YW5jZSBvZjoKICogICAoQykgMjAwMiBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLm9yZz4KICoKICogSW5pdGlhbCB3b3JrOgogKiAgIChDKSAyMDAwIEluLVN5c3RlbSBEZXNpZ24sIEluYy4gKHN1cHBvcnRAaW4tc3lzdGVtLmNvbSkKICoKICogVGhlIElTRDIwMCBBU0lDIGRvZXMgbm90IG5hdGl2ZWx5IHN1cHBvcnQgQVRBIGRldmljZXMuICBUaGUgY2hpcAogKiBkb2VzIGltcGxlbWVudCBhbiBpbnRlcmZhY2UsIHRoZSBBVEEgQ29tbWFuZCBCbG9jayAoQVRBQ0IpIHdoaWNoIHByb3ZpZGVzCiAqIGEgbWVhbnMgb2YgcGFzc2luZyBBVEEgY29tbWFuZHMgYW5kIEFUQSByZWdpc3RlciBhY2Nlc3NlcyB0byBhIGRldmljZS4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqIEhpc3Rvcnk6CiAqCiAqICAyMDAyLTEwLTE5OiBSZW1vdmVkIHRoZSBzcGVjaWFsaXplZCB0cmFuc2ZlciByb3V0aW5lcy4KICoJCShBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PikKICogIDIwMDEtMDItMjQ6IFJlbW92ZWQgbG90cyBvZiBkdXBsaWNhdGUgY29kZSBhbmQgc2ltcGxpZmllZCB0aGUgc3RydWN0dXJlLgogKgkgICAgICAoYmpvcm5AaGF4eC5zZSkKICogIDIwMDItMDEtMTY6IEZpeGVkIGVuZGlhbm5lc3MgYnVnIHNvIGl0IHdvcmtzIG9uIHRoZSBwcGMgYXJjaC4KICoJICAgICAgKEx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4pCiAqICAyMDAyLTAxLTE3OiBBbGwgYml0ZmllbGRzIHJlbW92ZWQuCiAqCSAgICAgIChiam9ybkBoYXh4LnNlKQogKi8KCgovKiBJbmNsdWRlIGZpbGVzICovCgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvYXRhLmg+CiNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgojaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KCiNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CgojaW5jbHVkZSAidXNiLmgiCiNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKI2luY2x1ZGUgInByb3RvY29sLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKCk1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBJbi1TeXN0ZW0gRGVzaWduLCBJbmMuIElTRDIwMCBBU0lDIik7Ck1PRFVMRV9BVVRIT1IoIkJq9nJuIFN0ZW5iZXJnIDxiam9ybkBoYXh4LnNlPiIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpzdGF0aWMgaW50IGlzZDIwMF9Jbml0aWFsaXphdGlvbihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwoKCi8qCiAqIFRoZSB0YWJsZSBvZiBkZXZpY2VzCiAqLwojZGVmaW5lIFVOVVNVQUxfREVWKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKCQkgICAgdmVuZG9yTmFtZSwgcHJvZHVjdE5hbWUsIHVzZVByb3RvY29sLCB1c2VUcmFuc3BvcnQsIFwKCQkgICAgaW5pdEZ1bmN0aW9uLCBmbGFncykgXAp7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgpLCBcCiAgLmRyaXZlcl9pbmZvID0gKGZsYWdzKXwoVVNCX1VTX1RZUEVfU1RPUjw8MjQpIH0KCnN0cnVjdCB1c2JfZGV2aWNlX2lkIGlzZDIwMF91c2JfaWRzW10gPSB7CiMJaW5jbHVkZSAidW51c3VhbF9pc2QyMDAuaCIKCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlzZDIwMF91c2JfaWRzKTsKCiN1bmRlZiBVTlVTVUFMX0RFVgojdW5kZWYgVVNVQUxfREVWCgovKgogKiBUaGUgZmxhZ3MgdGFibGUKICovCiNkZWZpbmUgVU5VU1VBTF9ERVYoaWRWZW5kb3IsIGlkUHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKCQkgICAgdmVuZG9yX25hbWUsIHByb2R1Y3RfbmFtZSwgdXNlX3Byb3RvY29sLCB1c2VfdHJhbnNwb3J0LCBcCgkJICAgIGluaXRfZnVuY3Rpb24sIEZsYWdzKSBcCnsgXAoJLnZlbmRvck5hbWUgPSB2ZW5kb3JfbmFtZSwJXAoJLnByb2R1Y3ROYW1lID0gcHJvZHVjdF9uYW1lLAlcCgkudXNlUHJvdG9jb2wgPSB1c2VfcHJvdG9jb2wsCVwKCS51c2VUcmFuc3BvcnQgPSB1c2VfdHJhbnNwb3J0LAlcCgkuaW5pdEZ1bmN0aW9uID0gaW5pdF9mdW5jdGlvbiwJXAp9CgpzdGF0aWMgc3RydWN0IHVzX3VudXN1YWxfZGV2IGlzZDIwMF91bnVzdWFsX2Rldl9saXN0W10gPSB7CiMJaW5jbHVkZSAidW51c3VhbF9pc2QyMDAuaCIKCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKCiN1bmRlZiBVTlVTVUFMX0RFVgojdW5kZWYgVVNVQUxfREVWCgoKLyogVGltZW91dCBkZWZpbmVzIChpbiBTZWNvbmRzKSAqLwoKI2RlZmluZSBJU0QyMDBfRU5VTV9CU1lfVElNRU9VVAkJMzUKI2RlZmluZSBJU0QyMDBfRU5VTV9ERVRFQ1RfVElNRU9VVCAgICAgIDMwCiNkZWZpbmUgSVNEMjAwX0RFRkFVTFRfVElNRU9VVAkJMzAKCi8qIGRldmljZSBmbGFncyAqLwojZGVmaW5lIERGX0FUQV9ERVZJQ0UJCTB4MDAwMQojZGVmaW5lIERGX01FRElBX1NUQVRVU19FTkFCTEVECTB4MDAwMgojZGVmaW5lIERGX1JFTU9WQUJMRV9NRURJQQkweDAwMDQKCi8qIGNhcGFiaWxpdHkgYml0IGRlZmluaXRpb25zICovCiNkZWZpbmUgQ0FQQUJJTElUWV9ETUEJCTB4MDEKI2RlZmluZSBDQVBBQklMSVRZX0xCQQkJMHgwMgoKLyogY29tbWFuZF9zZXRYIGJpdCBkZWZpbml0aW9ucyAqLwojZGVmaW5lIENPTU1BTkRTRVRfUkVNT1ZBQkxFCTB4MDIKI2RlZmluZSBDT01NQU5EU0VUX01FRElBX1NUQVRVUyAweDEwCgovKiBBVEEgVmVuZG9yIFNwZWNpZmljIGRlZmluZXMgKi8KI2RlZmluZSBBVEFfQUREUkVTU19ERVZIRUFEX1NURCAgICAgIDB4YTAKI2RlZmluZSBBVEFfQUREUkVTU19ERVZIRUFEX0xCQV9NT0RFIDB4NDAgICAgCiNkZWZpbmUgQVRBX0FERFJFU1NfREVWSEVBRF9TTEFWRSAgICAweDEwCgovKiBBY3Rpb24gU2VsZWN0IGJpdHMgKi8KI2RlZmluZSBBQ1RJT05fU0VMRUNUXzAJICAgICAweDAxCiNkZWZpbmUgQUNUSU9OX1NFTEVDVF8xCSAgICAgMHgwMgojZGVmaW5lIEFDVElPTl9TRUxFQ1RfMgkgICAgIDB4MDQKI2RlZmluZSBBQ1RJT05fU0VMRUNUXzMJICAgICAweDA4CiNkZWZpbmUgQUNUSU9OX1NFTEVDVF80CSAgICAgMHgxMAojZGVmaW5lIEFDVElPTl9TRUxFQ1RfNQkgICAgIDB4MjAKI2RlZmluZSBBQ1RJT05fU0VMRUNUXzYJICAgICAweDQwCiNkZWZpbmUgQUNUSU9OX1NFTEVDVF83CSAgICAgMHg4MAoKLyogUmVnaXN0ZXIgU2VsZWN0IGJpdHMgKi8KI2RlZmluZSBSRUdfQUxURVJOQVRFX1NUQVRVUwkweDAxCiNkZWZpbmUgUkVHX0RFVklDRV9DT05UUk9MCTB4MDEKI2RlZmluZSBSRUdfRVJST1IJCTB4MDIKI2RlZmluZSBSRUdfRkVBVFVSRVMJCTB4MDIKI2RlZmluZSBSRUdfU0VDVE9SX0NPVU5UCTB4MDQKI2RlZmluZSBSRUdfU0VDVE9SX05VTUJFUgkweDA4CiNkZWZpbmUgUkVHX0NZTElOREVSX0xPVwkweDEwCiNkZWZpbmUgUkVHX0NZTElOREVSX0hJR0gJMHgyMAojZGVmaW5lIFJFR19ERVZJQ0VfSEVBRAkJMHg0MAojZGVmaW5lIFJFR19TVEFUVVMJCTB4ODAKI2RlZmluZSBSRUdfQ09NTUFORAkJMHg4MAoKLyogQVRBIHJlZ2lzdGVycyBvZmZzZXQgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBBVEFfUkVHX0VSUk9SX09GRlNFVAkJMQojZGVmaW5lIEFUQV9SRUdfTENZTF9PRkZTRVQJCTQKI2RlZmluZSBBVEFfUkVHX0hDWUxfT0ZGU0VUCQk1CiNkZWZpbmUgQVRBX1JFR19TVEFUVVNfT0ZGU0VUCQk3CgovKiBBVEEgZXJyb3IgZGVmaW5pdGlvbnMgbm90IGluIDxsaW51eC9oZHJlZy5oPiAqLwojZGVmaW5lIEFUQV9FUlJPUl9NRURJQV9DSEFOR0UJCTB4MjAKCi8qIEFUQSBjb21tYW5kIGRlZmluaXRpb25zIG5vdCBpbiA8bGludXgvaGRyZWcuaD4gKi8KI2RlZmluZSBBVEFfQ09NTUFORF9HRVRfTUVESUFfU1RBVFVTCTB4REEKI2RlZmluZSBBVEFfQ09NTUFORF9NRURJQV9FSkVDVAkJMHhFRAoKLyogQVRBIGRyaXZlIGNvbnRyb2wgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBBVEFfRENfRElTQUJMRV9JTlRFUlJVUFRTCTB4MDIKI2RlZmluZSBBVEFfRENfUkVTRVRfQ09OVFJPTExFUgkJMHgwNAojZGVmaW5lIEFUQV9EQ19SRUVOQUJMRV9DT05UUk9MTEVSCTB4MDAKCi8qCiAqICBHZW5lcmFsIHB1cnBvc2UgcmV0dXJuIGNvZGVzCiAqLyAKCiNkZWZpbmUgSVNEMjAwX0VSUk9SCQktMQojZGVmaW5lIElTRDIwMF9HT09ECQkgMAoKLyoKICogVHJhbnNwb3J0IHJldHVybiBjb2RlcwogKi8KCiNkZWZpbmUgSVNEMjAwX1RSQU5TUE9SVF9HT09EICAgICAgIDAgICAvKiBUcmFuc3BvcnQgZ29vZCwgY29tbWFuZCBnb29kICAgICAqLwojZGVmaW5lIElTRDIwMF9UUkFOU1BPUlRfRkFJTEVEICAgICAxICAgLyogVHJhbnNwb3J0IGdvb2QsIGNvbW1hbmQgZmFpbGVkICAgKi8KI2RlZmluZSBJU0QyMDBfVFJBTlNQT1JUX0VSUk9SICAgICAgMiAgIC8qIFRyYW5zcG9ydCBiYWQgKGkuZS4gZGV2aWNlIGRlYWQpICovCgovKiBkcml2ZXIgYWN0aW9uIGNvZGVzICovCiNkZWZpbmUJQUNUSU9OX1JFQURfU1RBVFVTCTAKI2RlZmluZQlBQ1RJT05fUkVTRVQJCTEKI2RlZmluZQlBQ1RJT05fUkVFTkFCTEUJCTIKI2RlZmluZQlBQ1RJT05fU09GVF9SRVNFVAkzCiNkZWZpbmUJQUNUSU9OX0VOVU0JCTQKI2RlZmluZQlBQ1RJT05fSURFTlRJRlkJCTUKCgovKgogKiBhdGFfY2RiIHN0cnVjdAogKi8KCgp1bmlvbiBhdGFfY2RiIHsKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTNGNjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMzsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNDsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNzsKCQl1bnNpZ25lZCBjaGFyIFJlc2VydmVkWzNdOwoJfSBnZW5lcmljOwoKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIEFsdGVybmF0ZVN0YXR1c0J5dGU7CgkJdW5zaWduZWQgY2hhciBFcnJvckJ5dGU7CgkJdW5zaWduZWQgY2hhciBTZWN0b3JDb3VudEJ5dGU7CgkJdW5zaWduZWQgY2hhciBTZWN0b3JOdW1iZXJCeXRlOwoJCXVuc2lnbmVkIGNoYXIgQ3lsaW5kZXJMb3dCeXRlOwoJCXVuc2lnbmVkIGNoYXIgQ3lsaW5kZXJIaWdoQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIERldmljZUhlYWRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU3RhdHVzQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIFJlc2VydmVkWzNdOwoJfSByZWFkOwoKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIERldmljZUNvbnRyb2xCeXRlOwoJCXVuc2lnbmVkIGNoYXIgRmVhdHVyZXNCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU2VjdG9yQ291bnRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU2VjdG9yTnVtYmVyQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIEN5bGluZGVyTG93Qnl0ZTsKCQl1bnNpZ25lZCBjaGFyIEN5bGluZGVySGlnaEJ5dGU7CgkJdW5zaWduZWQgY2hhciBEZXZpY2VIZWFkQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIENvbW1hbmRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbM107Cgl9IHdyaXRlOwp9OwoKCi8qCiAqIElucXVpcnkgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgaXMgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgdGFyZ2V0CiAqIGFmdGVyIGl0IHJlY2VpdmVzIGFuIGlucXVpcnkuCiAqCiAqIFRoaXMgc3RydWN0dXJlIG1heSBiZSBleHRlbmRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZAogKiBpbiB0aGUgZmllbGQgQWRkaXRpb25hbExlbmd0aC4gVGhlIGRlZmluZWQgc2l6ZSBjb25zdGFudCBvbmx5CiAqIGluY2x1ZGVzIGZpZWxkcyB0aHJvdWdoIFByb2R1Y3RSZXZpc2lvbkxldmVsLgogKi8KCi8qCiAqIERldmljZVR5cGUgZmllbGQKICovCiNkZWZpbmUgRElSRUNUX0FDQ0VTU19ERVZJQ0UJICAgIDB4MDAgICAgLyogZGlza3MgKi8KI2RlZmluZSBERVZJQ0VfUkVNT1ZBQkxFCQkweDgwCgpzdHJ1Y3QgaW5xdWlyeV9kYXRhIHsKICAgCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZTsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZU1vZGlmaWVyOwoJdW5zaWduZWQgY2hhciBWZXJzaW9uczsKCXVuc2lnbmVkIGNoYXIgRm9ybWF0OyAKCXVuc2lnbmVkIGNoYXIgQWRkaXRpb25hbExlbmd0aDsKCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbMl07Cgl1bnNpZ25lZCBjaGFyIENhcGFiaWxpdHk7Cgl1bnNpZ25lZCBjaGFyIFZlbmRvcklkWzhdOwoJdW5zaWduZWQgY2hhciBQcm9kdWN0SWRbMTZdOwoJdW5zaWduZWQgY2hhciBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKCXVuc2lnbmVkIGNoYXIgVmVuZG9yU3BlY2lmaWNbMjBdOwoJdW5zaWduZWQgY2hhciBSZXNlcnZlZDNbNDBdOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKCi8qCiAqIElOUVVJUlkgZGF0YSBidWZmZXIgc2l6ZQogKi8KCiNkZWZpbmUgSU5RVUlSWURBVEFCVUZGRVJTSVpFIDM2CgoKLyoKICogSVNEMjAwIENPTkZJRyBkYXRhIHN0cnVjdAogKi8KCiNkZWZpbmUgQVRBQ0ZHX1RJTUlORwkgIDB4MGYKI2RlZmluZSBBVEFDRkdfQVRBUElfUkVTRVQgICAgIDB4MTAKI2RlZmluZSBBVEFDRkdfTUFTVEVSCSAgMHgyMAojZGVmaW5lIEFUQUNGR19CTE9DS1NJWkUgICAgICAgMHhhMAoKI2RlZmluZSBBVEFDRkdFX0xBU1RfTFVOICAgICAgIDB4MDcKI2RlZmluZSBBVEFDRkdFX0RFU0NfT1ZFUlJJREUgIDB4MDgKI2RlZmluZSBBVEFDRkdFX1NUQVRFX1NVU1BFTkQgIDB4MTAKI2RlZmluZSBBVEFDRkdFX1NLSVBfQk9PVCAgICAgIDB4MjAKI2RlZmluZSBBVEFDRkdFX0NPTkZfREVTQzIgICAgIDB4NDAKI2RlZmluZSBBVEFDRkdFX0lOSVRfU1RBVFVTICAgIDB4ODAKCiNkZWZpbmUgQ0ZHX0NBUEFCSUxJVFlfU1JTVCAgICAweDAxCgpzdHJ1Y3QgaXNkMjAwX2NvbmZpZyB7Cgl1bnNpZ25lZCBjaGFyIEV2ZW50Tm90aWZpY2F0aW9uOwoJdW5zaWduZWQgY2hhciBFeHRlcm5hbENsb2NrOwoJdW5zaWduZWQgY2hhciBBVEFJbml0VGltZW91dDsKCXVuc2lnbmVkIGNoYXIgQVRBQ29uZmlnOwoJdW5zaWduZWQgY2hhciBBVEFNYWpvckNvbW1hbmQ7Cgl1bnNpZ25lZCBjaGFyIEFUQU1pbm9yQ29tbWFuZDsKCXVuc2lnbmVkIGNoYXIgQVRBRXh0cmFDb25maWc7Cgl1bnNpZ25lZCBjaGFyIENhcGFiaWxpdHk7Cn1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CgoKLyoKICogSVNEMjAwIGRyaXZlciBpbmZvcm1hdGlvbiBzdHJ1Y3QKICovCgpzdHJ1Y3QgaXNkMjAwX2luZm8gewoJc3RydWN0IGlucXVpcnlfZGF0YSBJbnF1aXJ5RGF0YTsKCXUxNiAqaWQ7CglzdHJ1Y3QgaXNkMjAwX2NvbmZpZyBDb25maWdEYXRhOwoJdW5zaWduZWQgY2hhciAqUmVnc0J1ZjsKCXVuc2lnbmVkIGNoYXIgQVRBUmVnc1s4XTsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlSGVhZDsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlRmxhZ3M7CgoJLyogbWF4aW11bSBudW1iZXIgb2YgTFVOcyBzdXBwb3J0ZWQgKi8KCXVuc2lnbmVkIGNoYXIgTWF4TFVOczsKCXVuc2lnbmVkIGNoYXIgY21uZFtCTEtfTUFYX0NEQl07CglzdHJ1Y3Qgc2NzaV9jbW5kIHNyYjsKCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKfTsKCgovKgogKiBSZWFkIENhcGFjaXR5IERhdGEgLSByZXR1cm5lZCBpbiBCaWcgRW5kaWFuIGZvcm1hdAogKi8KCnN0cnVjdCByZWFkX2NhcGFjaXR5X2RhdGEgewoJX19iZTMyIExvZ2ljYWxCbG9ja0FkZHJlc3M7CglfX2JlMzIgQnl0ZXNQZXJCbG9jazsKfTsKCi8qCiAqIFJlYWQgQmxvY2sgTGltaXRzIERhdGEgLSByZXR1cm5lZCBpbiBCaWcgRW5kaWFuIGZvcm1hdAogKiBUaGlzIHN0cnVjdHVyZSByZXR1cm5zIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIGJsb2NrCiAqIHNpemUgZm9yIGEgVEFQRSBkZXZpY2UuCiAqLwoKc3RydWN0IHJlYWRfYmxvY2tfbGltaXRzIHsKCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ7Cgl1bnNpZ25lZCBjaGFyIEJsb2NrTWF4aW11bVNpemVbM107Cgl1bnNpZ25lZCBjaGFyIEJsb2NrTWluaW11bVNpemVbMl07Cn07CgoKLyoKICogU2Vuc2UgRGF0YSBGb3JtYXQKICovCgojZGVmaW5lIFNFTlNFX0VSUkNPREUJICAgMHg3ZgojZGVmaW5lIFNFTlNFX0VSUkNPREVfVkFMSUQgICAgIDB4ODAKI2RlZmluZSBTRU5TRV9GTEFHX1NFTlNFX0tFWSAgICAweDBmCiNkZWZpbmUgU0VOU0VfRkxBR19CQURfTEVOR1RIICAgMHgyMAojZGVmaW5lIFNFTlNFX0ZMQUdfRU5EX09GX01FRElBIDB4NDAKI2RlZmluZSBTRU5TRV9GTEFHX0ZJTEVfTUFSSyAgICAweDgwCnN0cnVjdCBzZW5zZV9kYXRhIHsKCXVuc2lnbmVkIGNoYXIgRXJyb3JDb2RlOwoJdW5zaWduZWQgY2hhciBTZWdtZW50TnVtYmVyOwoJdW5zaWduZWQgY2hhciBGbGFnczsKCXVuc2lnbmVkIGNoYXIgSW5mb3JtYXRpb25bNF07Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUxlbmd0aDsKCXVuc2lnbmVkIGNoYXIgQ29tbWFuZFNwZWNpZmljSW5mb3JtYXRpb25bNF07Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUNvZGU7Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXI7Cgl1bnNpZ25lZCBjaGFyIEZpZWxkUmVwbGFjZWFibGVVbml0Q29kZTsKCXVuc2lnbmVkIGNoYXIgU2Vuc2VLZXlTcGVjaWZpY1szXTsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CgovKgogKiBEZWZhdWx0IHJlcXVlc3Qgc2Vuc2UgYnVmZmVyIHNpemUKICovCgojZGVmaW5lIFNFTlNFX0JVRkZFUl9TSVpFIDE4CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSGVscGVyIHJvdXRpbmVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfYnVpbGRfc2Vuc2UKICoJCQkJCQkJCQkgCiAqICBCdWlsZHMgYW4gYXJ0aWZpY2lhbCBzZW5zZSBidWZmZXIgdG8gcmVwb3J0IHRoZSByZXN1bHRzIG9mIGEgCiAqICBmYWlsZWQgY29tbWFuZC4KICoJCQkJCQkJCSAgICAgICAKICogUkVUVVJOUzoKICogICAgdm9pZAogKi8Kc3RhdGljIHZvaWQgaXNkMjAwX2J1aWxkX3NlbnNlKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJc3RydWN0IHNlbnNlX2RhdGEgKmJ1ZiA9IChzdHJ1Y3Qgc2Vuc2VfZGF0YSAqKSAmc3JiLT5zZW5zZV9idWZmZXJbMF07Cgl1bnNpZ25lZCBjaGFyIGVycm9yID0gaW5mby0+QVRBUmVnc1tBVEFfUkVHX0VSUk9SX09GRlNFVF07CgoJaWYoZXJyb3IgJiBBVEFfRVJST1JfTUVESUFfQ0hBTkdFKSB7CgkJYnVmLT5FcnJvckNvZGUgPSAweDcwIHwgU0VOU0VfRVJSQ09ERV9WQUxJRDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDB4YjsKCQlidWYtPkZsYWdzID0gVU5JVF9BVFRFTlRJT047CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIgPSAwOwoJfSBlbHNlIGlmIChlcnJvciAmIEFUQV9NQ1IpIHsKCQlidWYtPkVycm9yQ29kZSA9IDB4NzAgfCBTRU5TRV9FUlJDT0RFX1ZBTElEOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlTGVuZ3RoID0gMHhiOwoJCWJ1Zi0+RmxhZ3MgPSAgVU5JVF9BVFRFTlRJT047CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIgPSAwOwoJfSBlbHNlIGlmIChlcnJvciAmIEFUQV9UUkswTkYpIHsKCQlidWYtPkVycm9yQ29kZSA9IDB4NzAgfCBTRU5TRV9FUlJDT0RFX1ZBTElEOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlTGVuZ3RoID0gMHhiOwoJCWJ1Zi0+RmxhZ3MgPSAgTk9UX1JFQURZOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZSA9IDA7CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyID0gMDsKCX0gZWxzZSBpZiAoZXJyb3IgJiBBVEFfVU5DKSB7CgkJYnVmLT5FcnJvckNvZGUgPSAweDcwIHwgU0VOU0VfRVJSQ09ERV9WQUxJRDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDB4YjsKCQlidWYtPkZsYWdzID0gIERBVEFfUFJPVEVDVDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGUgPSAwOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllciA9IDA7Cgl9IGVsc2UgewoJCWJ1Zi0+RXJyb3JDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDA7CgkJYnVmLT5GbGFncyA9ICAwOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZSA9IDA7CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyID0gMDsKCX0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUcmFuc3BvcnQgcm91dGluZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBpc2QyMDBfc2V0X3NyYigpLCBpc2QyMDBfc3JiX3NldF9idWZmbGVuKCkKICoKICogVHdvIGhlbHBlcnMgdG8gZmFjaWxpdGF0ZSBpbiBpbml0aWFsaXphdGlvbiBvZiBzY3NpX2NtbmQgc3RydWN0dXJlCiAqIFdpbGwgbmVlZCB0byBjaGFuZ2Ugd2hlbiBzdHJ1Y3Qgc2NzaV9jbW5kIGNoYW5nZXMKICovCnN0YXRpYyB2b2lkIGlzZDIwMF9zZXRfc3JiKHN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbywKCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdm9pZCogYnVmZiwgdW5zaWduZWQgYnVmZmxlbikKewoJc3RydWN0IHNjc2lfY21uZCAqc3JiID0gJmluZm8tPnNyYjsKCglpZiAoYnVmZikKCQlzZ19pbml0X29uZSgmaW5mby0+c2csIGJ1ZmYsIGJ1ZmZsZW4pOwoKCXNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPSBkaXI7CglzcmItPnNkYi50YWJsZS5zZ2wgPSBidWZmID8gJmluZm8tPnNnIDogTlVMTDsKCXNyYi0+c2RiLmxlbmd0aCA9IGJ1ZmZsZW47CglzcmItPnNkYi50YWJsZS5uZW50cyA9IGJ1ZmYgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQgaXNkMjAwX3NyYl9zZXRfYnVmZmxlbihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHVuc2lnbmVkIGJ1ZmZsZW4pCnsKCXNyYi0+c2RiLmxlbmd0aCA9IGJ1ZmZsZW47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGlzZDIwMF9hY3Rpb24KICoKICogUm91dGluZSBmb3Igc2VuZGluZyBjb21tYW5kcyB0byB0aGUgaXNkMjAwCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfYWN0aW9uKCBzdHJ1Y3QgdXNfZGF0YSAqdXMsIGludCBhY3Rpb24sIAoJCQkgIHZvaWQqIHBvaW50ZXIsIGludCB2YWx1ZSApCnsKCXVuaW9uIGF0YV9jZGIgYXRhOwoJLyogc3RhdGljIHRvIHByZXZlbnQgdGhpcyBsYXJnZSBzdHJ1Y3QgYmVpbmcgcGxhY2VkIG9uIHRoZSB2YWx1YWJsZSBzdGFjayAqLwoJc3RhdGljIHN0cnVjdCBzY3NpX2RldmljZSBzcmJfZGV2OwoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvID0gKHN0cnVjdCBpc2QyMDBfaW5mbyAqKXVzLT5leHRyYTsKCXN0cnVjdCBzY3NpX2NtbmQgKnNyYiA9ICZpbmZvLT5zcmI7CglpbnQgc3RhdHVzOwoKCW1lbXNldCgmYXRhLCAwLCBzaXplb2YoYXRhKSk7CglzcmItPmNtbmQgPSBpbmZvLT5jbW5kOwoJc3JiLT5kZXZpY2UgPSAmc3JiX2RldjsKCSsrc3JiLT5zZXJpYWxfbnVtYmVyOwoKCWF0YS5nZW5lcmljLlNpZ25hdHVyZUJ5dGUwID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNYWpvckNvbW1hbmQ7CglhdGEuZ2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJYXRhLmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoKCXN3aXRjaCAoIGFjdGlvbiApIHsKCWNhc2UgQUNUSU9OX1JFQURfU1RBVFVTOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihSRUFEX1NUQVRVUylcbiIpOwoJCWF0YS5nZW5lcmljLkFjdGlvblNlbGVjdCA9IEFDVElPTl9TRUxFQ1RfMHxBQ1RJT05fU0VMRUNUXzI7CgkJYXRhLmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPQoJCSAgUkVHX0NZTElOREVSX0xPVyB8IFJFR19DWUxJTkRFUl9ISUdIIHwKCQkgIFJFR19TVEFUVVMgfCBSRUdfRVJST1I7CgkJaXNkMjAwX3NldF9zcmIoaW5mbywgRE1BX0ZST01fREVWSUNFLCBwb2ludGVyLCB2YWx1ZSk7CgkJYnJlYWs7CgoJY2FzZSBBQ1RJT05fRU5VTToKCQlVU19ERUJVR1AoIiAgIGlzZDIwMF9hY3Rpb24oRU5VTSwweCUwMngpXG4iLHZhbHVlKTsKCQlhdGEuZ2VuZXJpYy5BY3Rpb25TZWxlY3QgPSBBQ1RJT05fU0VMRUNUXzF8QUNUSU9OX1NFTEVDVF8yfAoJCQkJCSAgIEFDVElPTl9TRUxFQ1RfM3xBQ1RJT05fU0VMRUNUXzR8CgkJCQkJICAgQUNUSU9OX1NFTEVDVF81OwoJCWF0YS5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0RFVklDRV9IRUFEOwoJCWF0YS53cml0ZS5EZXZpY2VIZWFkQnl0ZSA9IHZhbHVlOwoJCWlzZDIwMF9zZXRfc3JiKGluZm8sIERNQV9OT05FLCBOVUxMLCAwKTsKCQlicmVhazsKCgljYXNlIEFDVElPTl9SRVNFVDoKCQlVU19ERUJVR1AoIiAgIGlzZDIwMF9hY3Rpb24oUkVTRVQpXG4iKTsKCQlhdGEuZ2VuZXJpYy5BY3Rpb25TZWxlY3QgPSBBQ1RJT05fU0VMRUNUXzF8QUNUSU9OX1NFTEVDVF8yfAoJCQkJCSAgIEFDVElPTl9TRUxFQ1RfM3xBQ1RJT05fU0VMRUNUXzQ7CgkJYXRhLmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfREVWSUNFX0NPTlRST0w7CgkJYXRhLndyaXRlLkRldmljZUNvbnRyb2xCeXRlID0gQVRBX0RDX1JFU0VUX0NPTlRST0xMRVI7CgkJaXNkMjAwX3NldF9zcmIoaW5mbywgRE1BX05PTkUsIE5VTEwsIDApOwoJCWJyZWFrOwoKCWNhc2UgQUNUSU9OX1JFRU5BQkxFOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihSRUVOQUJMRSlcbiIpOwoJCWF0YS5nZW5lcmljLkFjdGlvblNlbGVjdCA9IEFDVElPTl9TRUxFQ1RfMXxBQ1RJT05fU0VMRUNUXzJ8CgkJCQkJICAgQUNUSU9OX1NFTEVDVF8zfEFDVElPTl9TRUxFQ1RfNDsKCQlhdGEuZ2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19ERVZJQ0VfQ09OVFJPTDsKCQlhdGEud3JpdGUuRGV2aWNlQ29udHJvbEJ5dGUgPSBBVEFfRENfUkVFTkFCTEVfQ09OVFJPTExFUjsKCQlpc2QyMDBfc2V0X3NyYihpbmZvLCBETUFfTk9ORSwgTlVMTCwgMCk7CgkJYnJlYWs7CgoJY2FzZSBBQ1RJT05fU09GVF9SRVNFVDoKCQlVU19ERUJVR1AoIiAgIGlzZDIwMF9hY3Rpb24oU09GVF9SRVNFVClcbiIpOwoJCWF0YS5nZW5lcmljLkFjdGlvblNlbGVjdCA9IEFDVElPTl9TRUxFQ1RfMXxBQ1RJT05fU0VMRUNUXzU7CgkJYXRhLmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfREVWSUNFX0hFQUQgfCBSRUdfQ09NTUFORDsKCQlhdGEud3JpdGUuRGV2aWNlSGVhZEJ5dGUgPSBpbmZvLT5EZXZpY2VIZWFkOwoJCWF0YS53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DTURfREVWX1JFU0VUOwoJCWlzZDIwMF9zZXRfc3JiKGluZm8sIERNQV9OT05FLCBOVUxMLCAwKTsKCQlicmVhazsKCgljYXNlIEFDVElPTl9JREVOVElGWToKCQlVU19ERUJVR1AoIiAgIGlzZDIwMF9hY3Rpb24oSURFTlRJRlkpXG4iKTsKCQlhdGEuZ2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19DT01NQU5EOwoJCWF0YS53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DTURfSURfQVRBOwoJCWlzZDIwMF9zZXRfc3JiKGluZm8sIERNQV9GUk9NX0RFVklDRSwgaW5mby0+aWQsCgkJCQlBVEFfSURfV09SRFMgKiAyKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCVVTX0RFQlVHUCgiRXJyb3I6IFVuZGVmaW5lZCBhY3Rpb24gJWRcbiIsYWN0aW9uKTsKCQlyZXR1cm4gSVNEMjAwX0VSUk9SOwoJfQoKCW1lbWNweShzcmItPmNtbmQsICZhdGEsIHNpemVvZihhdGEuZ2VuZXJpYykpOwoJc3JiLT5jbWRfbGVuID0gc2l6ZW9mKGF0YS5nZW5lcmljKTsKCXN0YXR1cyA9IHVzYl9zdG9yX0J1bGtfdHJhbnNwb3J0KHNyYiwgdXMpOwoJaWYgKHN0YXR1cyA9PSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRCkKCQlzdGF0dXMgPSBJU0QyMDBfR09PRDsKCWVsc2UgewoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbigweCUwMngpIGVycm9yOiAlZFxuIixhY3Rpb24sc3RhdHVzKTsKCQlzdGF0dXMgPSBJU0QyMDBfRVJST1I7CgkJLyogbmVlZCB0byByZXNldCBkZXZpY2UgaGVyZSAqLwoJfQoKCXJldHVybiBzdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfcmVhZF9yZWdzCiAqCQkJCQkJCQkJIAogKiBSZWFkIEFUQSBSZWdpc3RlcnMKICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9yZWFkX3JlZ3MoIHN0cnVjdCB1c19kYXRhICp1cyApCnsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CglpbnQgdHJhbnNmZXJTdGF0dXM7CgoJVVNfREVCVUdQKCJFbnRlcmluZyBpc2QyMDBfSXNzdWVBVEFSZWFkUmVnc1xuIik7CgoJdHJhbnNmZXJTdGF0dXMgPSBpc2QyMDBfYWN0aW9uKCB1cywgQUNUSU9OX1JFQURfU1RBVFVTLAoJCQkJICAgIGluZm8tPlJlZ3NCdWYsIHNpemVvZihpbmZvLT5BVEFSZWdzKSApOwoJaWYgKHRyYW5zZmVyU3RhdHVzICE9IElTRDIwMF9UUkFOU1BPUlRfR09PRCkgewoJCVVTX0RFQlVHUCgiICAgRXJyb3IgcmVhZGluZyBBVEEgcmVnaXN0ZXJzXG4iKTsKCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7Cgl9IGVsc2UgewoJCW1lbWNweShpbmZvLT5BVEFSZWdzLCBpbmZvLT5SZWdzQnVmLCBzaXplb2YoaW5mby0+QVRBUmVncykpOwoJCVVTX0RFQlVHUCgiICAgR290IEFUQSBSZWdpc3RlcltBVEFfUkVHX0VSUk9SX09GRlNFVF0gPSAweCV4XG4iLAoJCQkgIGluZm8tPkFUQVJlZ3NbQVRBX1JFR19FUlJPUl9PRkZTRVRdKTsKCX0KCglyZXR1cm4gcmV0U3RhdHVzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEludm9rZSB0aGUgdHJhbnNwb3J0IGFuZCBiYXNpYyBlcnJvci1oYW5kbGluZy9yZWNvdmVyeSBtZXRob2RzCiAqCiAqIFRoaXMgaXMgdXNlZCBieSB0aGUgcHJvdG9jb2wgbGF5ZXJzIHRvIGFjdHVhbGx5IHNlbmQgdGhlIG1lc3NhZ2UgdG8KICogdGhlIGRldmljZSBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCiAqLwpzdGF0aWMgdm9pZCBpc2QyMDBfaW52b2tlX3RyYW5zcG9ydCggc3RydWN0IHVzX2RhdGEgKnVzLCAKCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqc3JiLCAKCQkJICAgICAgdW5pb24gYXRhX2NkYiAqYXRhQ2RiICkKewoJaW50IG5lZWRfYXV0b19zZW5zZSA9IDA7CglpbnQgdHJhbnNmZXJTdGF0dXM7CglpbnQgcmVzdWx0OwoKCS8qIHNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIHRyYW5zcG9ydCBsYXllciAqLwoJbWVtY3B5KHNyYi0+Y21uZCwgYXRhQ2RiLCBzaXplb2YoYXRhQ2RiLT5nZW5lcmljKSk7CglzcmItPmNtZF9sZW4gPSBzaXplb2YoYXRhQ2RiLT5nZW5lcmljKTsKCXRyYW5zZmVyU3RhdHVzID0gdXNiX3N0b3JfQnVsa190cmFuc3BvcnQoc3JiLCB1cyk7CgoJLyogaWYgdGhlIGNvbW1hbmQgZ2V0cyBhYm9ydGVkIGJ5IHRoZSBoaWdoZXIgbGF5ZXJzLCB3ZSBuZWVkIHRvCgkgKiBzaG9ydC1jaXJjdWl0IGFsbCBvdGhlciBwcm9jZXNzaW5nCgkgKi8KCWlmICh0ZXN0X2JpdChVU19GTElEWF9USU1FRF9PVVQsICZ1cy0+ZGZsYWdzKSkgewoJCVVTX0RFQlVHUCgiLS0gY29tbWFuZCB3YXMgYWJvcnRlZFxuIik7CgkJZ290byBIYW5kbGVfQWJvcnQ7Cgl9CgoJc3dpdGNoICh0cmFuc2ZlclN0YXR1cykgewoKCWNhc2UgVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q6CgkJLyogSW5kaWNhdGUgYSBnb29kIHJlc3VsdCAqLwoJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQlicmVhazsKCgljYXNlIFVTQl9TVE9SX1RSQU5TUE9SVF9OT19TRU5TRToKCQlVU19ERUJVR1AoIi0tIHRyYW5zcG9ydCBpbmRpY2F0ZXMgcHJvdG9jb2wgZmFpbHVyZVxuIik7CgkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CgkJcmV0dXJuOwoKCWNhc2UgVVNCX1NUT1JfVFJBTlNQT1JUX0ZBSUxFRDoKCQlVU19ERUJVR1AoIi0tIHRyYW5zcG9ydCBpbmRpY2F0ZXMgY29tbWFuZCBmYWlsdXJlXG4iKTsKCQluZWVkX2F1dG9fc2Vuc2UgPSAxOwoJCWJyZWFrOwoKCWNhc2UgVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOgoJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyB0cmFuc3BvcnQgZXJyb3JcbiIpOwoJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwoJCS8qIE5lZWQgcmVzZXQgaGVyZSAqLwoJCXJldHVybjsKICAgIAoJZGVmYXVsdDoKCQlVU19ERUJVR1AoIi0tIHRyYW5zcG9ydCBpbmRpY2F0ZXMgdW5rbm93biBlcnJvclxuIik7ICAgCgkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CgkJLyogTmVlZCByZXNldCBoZXJlICovCgkJcmV0dXJuOwoJfQoKCWlmICgoc2NzaV9nZXRfcmVzaWQoc3JiKSA+IDApICYmCgkgICAgISgoc3JiLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHx8CgkgICAgICAoc3JiLT5jbW5kWzBdID09IElOUVVJUlkpIHx8CgkgICAgICAoc3JiLT5jbW5kWzBdID09IE1PREVfU0VOU0UpIHx8CgkgICAgICAoc3JiLT5jbW5kWzBdID09IExPR19TRU5TRSkgfHwKCSAgICAgIChzcmItPmNtbmRbMF0gPT0gTU9ERV9TRU5TRV8xMCkpKSB7CgkJVVNfREVCVUdQKCItLSB1bmV4cGVjdGVkbHkgc2hvcnQgdHJhbnNmZXJcbiIpOwoJCW5lZWRfYXV0b19zZW5zZSA9IDE7Cgl9CgoJaWYgKG5lZWRfYXV0b19zZW5zZSkgewoJCXJlc3VsdCA9IGlzZDIwMF9yZWFkX3JlZ3ModXMpOwoJCWlmICh0ZXN0X2JpdChVU19GTElEWF9USU1FRF9PVVQsICZ1cy0+ZGZsYWdzKSkgewoJCQlVU19ERUJVR1AoIi0tIGF1dG8tc2Vuc2UgYWJvcnRlZFxuIik7CgkJCWdvdG8gSGFuZGxlX0Fib3J0OwoJCX0KCQlpZiAocmVzdWx0ID09IElTRDIwMF9HT09EKSB7CgkJCWlzZDIwMF9idWlsZF9zZW5zZSh1cywgc3JiKTsKCQkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CgoJCQkvKiBJZiB0aGluZ3MgYXJlIHJlYWxseSBva2F5LCB0aGVuIGxldCdzIHNob3cgdGhhdCAqLwoJCQlpZiAoKHNyYi0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSA9PSAweDApCgkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CgkJfSBlbHNlIHsKCQkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CgkJCS8qIE5lZWQgcmVzZXQgaGVyZSAqLwoJCX0KCX0KCgkvKiBSZWdhcmRsZXNzIG9mIGF1dG8tc2Vuc2UsIGlmIHdlIF9rbm93XyB3ZSBoYXZlIGFuIGVycm9yCgkgKiBjb25kaXRpb24sIHNob3cgdGhhdCBpbiB0aGUgcmVzdWx0IGNvZGUKCSAqLwoJaWYgKHRyYW5zZmVyU3RhdHVzID09IFVTQl9TVE9SX1RSQU5TUE9SVF9GQUlMRUQpCgkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CglyZXR1cm47CgoJLyogYWJvcnQgcHJvY2Vzc2luZzogdGhlIGJ1bGstb25seSB0cmFuc3BvcnQgcmVxdWlyZXMgYSByZXNldAoJICogZm9sbG93aW5nIGFuIGFib3J0ICovCglIYW5kbGVfQWJvcnQ6CglzcmItPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKCgkvKiBwZXJtaXQgdGhlIHJlc2V0IHRyYW5zZmVyIHRvIHRha2UgcGxhY2UgKi8KCWNsZWFyX2JpdChVU19GTElEWF9BQk9SVElORywgJnVzLT5kZmxhZ3MpOwoJLyogTmVlZCByZXNldCBoZXJlICovCn0KCiNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcKc3RhdGljIHZvaWQgaXNkMjAwX2xvZ19jb25maWcoIHN0cnVjdCBpc2QyMDBfaW5mbyogaW5mbyApCnsKCVVTX0RFQlVHUCgiICAgICAgRXZlbnQgTm90aWZpY2F0aW9uOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuRXZlbnROb3RpZmljYXRpb24pOwoJVVNfREVCVUdQKCIgICAgICBFeHRlcm5hbCBDbG9jazogMHgleFxuIiwgCgkJICBpbmZvLT5Db25maWdEYXRhLkV4dGVybmFsQ2xvY2spOwoJVVNfREVCVUdQKCIgICAgICBBVEEgSW5pdCBUaW1lb3V0OiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBSW5pdFRpbWVvdXQpOwoJVVNfREVCVUdQKCIgICAgICBBVEFQSSBDb21tYW5kIEJsb2NrIFNpemU6IDB4JXhcbiIsIAoJCSAgKGluZm8tPkNvbmZpZ0RhdGEuQVRBQ29uZmlnICYgQVRBQ0ZHX0JMT0NLU0laRSkgPj4gNik7CglVU19ERUJVR1AoIiAgICAgIE1hc3Rlci9TbGF2ZSBTZWxlY3Rpb246IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFDb25maWcgJiBBVEFDRkdfTUFTVEVSKTsKCVVTX0RFQlVHUCgiICAgICAgQVRBUEkgUmVzZXQ6IDB4JXhcbiIsCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyAmIEFUQUNGR19BVEFQSV9SRVNFVCk7CglVU19ERUJVR1AoIiAgICAgIEFUQSBUaW1pbmc6IDB4JXhcbiIsCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyAmIEFUQUNGR19USU1JTkcpOwoJVVNfREVCVUdQKCIgICAgICBBVEEgTWFqb3IgQ29tbWFuZDogMHgleFxuIiwgCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZCk7CglVU19ERUJVR1AoIiAgICAgIEFUQSBNaW5vciBDb21tYW5kOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kKTsKCVVTX0RFQlVHUCgiICAgICAgSW5pdCBTdGF0dXM6IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfSU5JVF9TVEFUVVMpOwoJVVNfREVCVUdQKCIgICAgICBDb25maWcgRGVzY3JpcHRvciAyOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBRXh0cmFDb25maWcgJiBBVEFDRkdFX0NPTkZfREVTQzIpOwoJVVNfREVCVUdQKCIgICAgICBTa2lwIERldmljZSBCb290OiAweCV4XG4iLAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfU0tJUF9CT09UKTsKCVVTX0RFQlVHUCgiICAgICAgQVRBIDMgU3RhdGUgU3Vwc2VuZDogMHgleFxuIiwKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBRXh0cmFDb25maWcgJiBBVEFDRkdFX1NUQVRFX1NVU1BFTkQpOwoJVVNfREVCVUdQKCIgICAgICBEZXNjcmlwdG9yIE92ZXJyaWRlOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBRXh0cmFDb25maWcgJiBBVEFDRkdFX0RFU0NfT1ZFUlJJREUpOwoJVVNfREVCVUdQKCIgICAgICBMYXN0IExVTiBJZGVudGlmaWVyOiAweCV4XG4iLAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfTEFTVF9MVU4pOwoJVVNfREVCVUdQKCIgICAgICBTUlNUIEVuYWJsZTogMHgleFxuIiwgCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUV4dHJhQ29uZmlnICYgQ0ZHX0NBUEFCSUxJVFlfU1JTVCk7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX3dyaXRlX2NvbmZpZwogKgkJCQkJCQkJCSAKICogV3JpdGUgdGhlIElTRDIwMCBDb25maWd1cmF0aW9uIGRhdGEKICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF93cml0ZV9jb25maWcoIHN0cnVjdCB1c19kYXRhICp1cyApIAp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJaW50IHJlc3VsdDsKCiNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX3dyaXRlX2NvbmZpZ1xuIik7CglVU19ERUJVR1AoIiAgIFdyaXRpbmcgdGhlIGZvbGxvd2luZyBJU0QyMDAgQ29uZmlnIERhdGE6XG4iKTsKCWlzZDIwMF9sb2dfY29uZmlnKGluZm8pOwojZW5kaWYKCgkvKiBsZXQncyBzZW5kIHRoZSBjb21tYW5kIHZpYSB0aGUgY29udHJvbCBwaXBlICovCglyZXN1bHQgPSB1c2Jfc3Rvcl9jdHJsX3RyYW5zZmVyKAoJCXVzLCAKCQl1cy0+c2VuZF9jdHJsX3BpcGUsCgkJMHgwMSwgCgkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAoJCTB4MDAwMCwgCgkJMHgwMDAyLCAKCQkodm9pZCAqKSAmaW5mby0+Q29uZmlnRGF0YSwgCgkJc2l6ZW9mKGluZm8tPkNvbmZpZ0RhdGEpKTsKCglpZiAocmVzdWx0ID49IDApIHsKCQlVU19ERUJVR1AoIiAgIElTRDIwMCBDb25maWcgRGF0YSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHlcbiIpOwoJfSBlbHNlIHsKCQlVU19ERUJVR1AoIiAgIFJlcXVlc3QgdG8gd3JpdGUgSVNEMjAwIENvbmZpZyBEYXRhIGZhaWxlZCFcbiIpOwoJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCX0KCglVU19ERUJVR1AoIkxlYXZpbmcgaXNkMjAwX3dyaXRlX2NvbmZpZyAlMDhYXG4iLCByZXRTdGF0dXMpOwoJcmV0dXJuIHJldFN0YXR1czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfcmVhZF9jb25maWcKICoJCQkJCQkJCQkgCiAqIFJlYWRzIHRoZSBJU0QyMDAgQ29uZmlndXJhdGlvbiBkYXRhCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfcmVhZF9jb25maWcoIHN0cnVjdCB1c19kYXRhICp1cyApIAp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJaW50IHJlc3VsdDsKCglVU19ERUJVR1AoIkVudGVyaW5nIGlzZDIwMF9yZWFkX2NvbmZpZ1xuIik7CgoJLyogcmVhZCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIElTRDIwMC4gIFVzZSB0aGlzIHRvICovCgkvKiBkZXRlcm1pbmUgd2hhdCB0aGUgc3BlY2lhbCBBVEEgQ0RCIGJ5dGVzIGFyZS4JCSovCgoJcmVzdWx0ID0gdXNiX3N0b3JfY3RybF90cmFuc2ZlcigKCQl1cywgCgkJdXMtPnJlY3ZfY3RybF9waXBlLAoJCTB4MDIsIAoJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAoJCTB4MDAwMCwgCgkJMHgwMDAyLCAKCQkodm9pZCAqKSAmaW5mby0+Q29uZmlnRGF0YSwgCgkJc2l6ZW9mKGluZm8tPkNvbmZpZ0RhdGEpKTsKCgoJaWYgKHJlc3VsdCA+PSAwKSB7CgkJVVNfREVCVUdQKCIgICBSZXRyaWV2ZWQgdGhlIGZvbGxvd2luZyBJU0QyMDAgQ29uZmlnIERhdGE6XG4iKTsKI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRwoJCWlzZDIwMF9sb2dfY29uZmlnKGluZm8pOwojZW5kaWYKCX0gZWxzZSB7CgkJVVNfREVCVUdQKCIgICBSZXF1ZXN0IHRvIGdldCBJU0QyMDAgQ29uZmlnIERhdGEgZmFpbGVkIVxuIik7CgkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJfQoKCVVTX0RFQlVHUCgiTGVhdmluZyBpc2QyMDBfcmVhZF9jb25maWcgJTA4WFxuIiwgcmV0U3RhdHVzKTsKCXJldHVybiByZXRTdGF0dXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX2F0YXBpX3NvZnRfcmVzZXQKICoJCQkJCQkJCQkgCiAqIFBlcmZvcm0gYW4gQXRhcGkgU29mdCBSZXNldCBvbiB0aGUgZGV2aWNlCiAqCiAqIFJFVFVSTlM6CiAqICAgIE5UIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9hdGFwaV9zb2Z0X3Jlc2V0KCBzdHJ1Y3QgdXNfZGF0YSAqdXMgKSAKewoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJaW50IHRyYW5zZmVyU3RhdHVzOwoKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX2F0YXBpX3NvZnRfcmVzZXRcbiIpOwoKCXRyYW5zZmVyU3RhdHVzID0gaXNkMjAwX2FjdGlvbiggdXMsIEFDVElPTl9TT0ZUX1JFU0VULCBOVUxMLCAwICk7CglpZiAodHJhbnNmZXJTdGF0dXMgIT0gSVNEMjAwX1RSQU5TUE9SVF9HT09EKSB7CgkJVVNfREVCVUdQKCIgICBFcnJvciBpc3N1aW5nIEF0YXBpIFNvZnQgUmVzZXRcbiIpOwoJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCX0KCglVU19ERUJVR1AoIkxlYXZpbmcgaXNkMjAwX2F0YXBpX3NvZnRfcmVzZXQgJTA4WFxuIiwgcmV0U3RhdHVzKTsKCXJldHVybiByZXRTdGF0dXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX3Nyc3QKICoJCQkJCQkJCQkgCiAqIFBlcmZvcm0gYW4gU1JTVCBvbiB0aGUgZGV2aWNlCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfc3JzdCggc3RydWN0IHVzX2RhdGEgKnVzICkgCnsKCWludCByZXRTdGF0dXMgPSBJU0QyMDBfR09PRDsKCWludCB0cmFuc2ZlclN0YXR1czsKCglVU19ERUJVR1AoIkVudGVyaW5nIGlzZDIwMF9TUlNUXG4iKTsKCgl0cmFuc2ZlclN0YXR1cyA9IGlzZDIwMF9hY3Rpb24oIHVzLCBBQ1RJT05fUkVTRVQsIE5VTEwsIDAgKTsKCgkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyByZXF1ZXN0IGZhaWxlZCAqLwoJaWYgKHRyYW5zZmVyU3RhdHVzICE9IElTRDIwMF9UUkFOU1BPUlRfR09PRCkgewoJCVVTX0RFQlVHUCgiICAgRXJyb3IgaXNzdWluZyBTUlNUXG4iKTsKCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7Cgl9IGVsc2UgewoJCS8qIGRlbGF5IDEwbXMgdG8gZ2l2ZSB0aGUgZHJpdmUgYSBjaGFuY2UgdG8gc2VlIGl0ICovCgkJbXNsZWVwKDEwKTsKCgkJdHJhbnNmZXJTdGF0dXMgPSBpc2QyMDBfYWN0aW9uKCB1cywgQUNUSU9OX1JFRU5BQkxFLCBOVUxMLCAwICk7CgkJaWYgKHRyYW5zZmVyU3RhdHVzICE9IElTRDIwMF9UUkFOU1BPUlRfR09PRCkgewoJCQlVU19ERUJVR1AoIiAgIEVycm9yIHRha2luZyBkcml2ZSBvdXQgb2YgcmVzZXRcbiIpOwoJCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7CgkJfSBlbHNlIHsKCQkJLyogZGVsYXkgNTBtcyB0byBnaXZlIHRoZSBkcml2ZSBhIGNoYW5jZSB0byByZWNvdmVyIGFmdGVyIFNSU1QgKi8KCQkJbXNsZWVwKDUwKTsKCQl9Cgl9CgoJVVNfREVCVUdQKCJMZWF2aW5nIGlzZDIwMF9zcnN0ICUwOFhcbiIsIHJldFN0YXR1cyk7CglyZXR1cm4gcmV0U3RhdHVzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF90cnlfZW51bQogKgkJCQkJCQkJCSAKICogSGVscGVyIGZ1bmN0aW9uIGZvciBpc2QyMDBfbWFudWFsX2VudW0oKS4gRG9lcyBFTlVNIGFuZCBSRUFEX1NUQVRVUwogKiBhbmQgdHJpZXMgdG8gYW5hbHl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycwogKgogKiBSRVRVUk5TOgogKiAgICBJU0Qgc3RhdHVzIGNvZGUKICovCnN0YXRpYyBpbnQgaXNkMjAwX3RyeV9lbnVtKHN0cnVjdCB1c19kYXRhICp1cywgdW5zaWduZWQgY2hhciBtYXN0ZXJfc2xhdmUsCgkJCSAgIGludCBkZXRlY3QgKQp7CglpbnQgc3RhdHVzID0gSVNEMjAwX0dPT0Q7Cgl1bnNpZ25lZCBsb25nIGVuZFRpbWU7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJdW5zaWduZWQgY2hhciAqcmVncyA9IGluZm8tPlJlZ3NCdWY7CglpbnQgcmVjaGVja0FzTWFzdGVyID0gMDsKCglpZiAoIGRldGVjdCApCgkJZW5kVGltZSA9IGppZmZpZXMgKyBJU0QyMDBfRU5VTV9ERVRFQ1RfVElNRU9VVCAqIEhaOwoJZWxzZQoJCWVuZFRpbWUgPSBqaWZmaWVzICsgSVNEMjAwX0VOVU1fQlNZX1RJTUVPVVQgKiBIWjsKCgkvKiBsb29wIHVudGlsIHdlIGRldGVjdCAhQlNZIG9yIHRpbWVvdXQgKi8KCXdoaWxlKDEpIHsKI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRwoJCWNoYXIqIG1zdHIgPSBtYXN0ZXJfc2xhdmUgPT0gQVRBX0FERFJFU1NfREVWSEVBRF9TVEQgPwoJCQkiTWFzdGVyIiA6ICJTbGF2ZSI7CiNlbmRpZgoKCQlzdGF0dXMgPSBpc2QyMDBfYWN0aW9uKCB1cywgQUNUSU9OX0VOVU0sIE5VTEwsIG1hc3Rlcl9zbGF2ZSApOwoJCWlmICggc3RhdHVzICE9IElTRDIwMF9HT09EICkKCQkJYnJlYWs7CgoJCXN0YXR1cyA9IGlzZDIwMF9hY3Rpb24oIHVzLCBBQ1RJT05fUkVBRF9TVEFUVVMsIAoJCQkJCXJlZ3MsIDggKTsKCQlpZiAoIHN0YXR1cyAhPSBJU0QyMDBfR09PRCApCgkJCWJyZWFrOwoKCQlpZiAoIWRldGVjdCkgewoJCQlpZiAocmVnc1tBVEFfUkVHX1NUQVRVU19PRkZTRVRdICYgQVRBX0JVU1kpIHsKCQkJCVVTX0RFQlVHUCgiICAgJXMgc3RhdHVzIGlzIHN0aWxsIEJTWSwgdHJ5IGFnYWluLi4uXG4iLG1zdHIpOwoJCQl9IGVsc2UgewoJCQkJVVNfREVCVUdQKCIgICAlcyBzdGF0dXMgIUJTWSwgY29udGludWUgd2l0aCBuZXh0IG9wZXJhdGlvblxuIixtc3RyKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCS8qIGNoZWNrIGZvciBBVEFfQlVTWSBhbmQgKi8KCQkvKiBBVEFfREYgKHdvcmthcm91bmQgQVRBIFppcCBkcml2ZSkgYW5kICovCgkJLyogQVRBX0VSUiAod29ya2Fyb3VuZCBmb3IgQXJjaG9zIENELVJPTSkgKi8KCQllbHNlIGlmIChyZWdzW0FUQV9SRUdfU1RBVFVTX09GRlNFVF0gJgoJCQkgKEFUQV9CVVNZIHwgQVRBX0RGIHwgQVRBX0VSUikpIHsKCQkJVVNfREVCVUdQKCIgICBTdGF0dXMgaW5kaWNhdGVzIGl0IGlzIG5vdCByZWFkeSwgdHJ5IGFnYWluLi4uXG4iKTsKCQl9CgkJLyogY2hlY2sgZm9yIERSRFksIEFUQSBkZXZpY2VzIHNldCBEUkRZIGFmdGVyIFNSU1QgKi8KCQllbHNlIGlmIChyZWdzW0FUQV9SRUdfU1RBVFVTX09GRlNFVF0gJiBBVEFfRFJEWSkgewoJCQlVU19ERUJVR1AoIiAgIElkZW50aWZpZWQgQVRBIGRldmljZVxuIik7CgkJCWluZm8tPkRldmljZUZsYWdzIHw9IERGX0FUQV9ERVZJQ0U7CgkJCWluZm8tPkRldmljZUhlYWQgPSBtYXN0ZXJfc2xhdmU7CgkJCWJyZWFrOwoJCX0gCgkJLyogY2hlY2sgQ3lsaW5kZXIgSGlnaC9Mb3cgdG8KCQkgICBkZXRlcm1pbmUgaWYgaXQgaXMgYW4gQVRBUEkgZGV2aWNlCgkJKi8KCQllbHNlIGlmIChyZWdzW0FUQV9SRUdfSENZTF9PRkZTRVRdID09IDB4RUIgJiYKCQkJIHJlZ3NbQVRBX1JFR19MQ1lMX09GRlNFVF0gPT0gMHgxNCkgewoJCQkvKiBJdCBzZWVtcyB0aGF0IHRoZSBSSUNPSCAKCQkJICAgTVA2MjAwQSBDRC9SVyBkcml2ZSB3aWxsIAoJCQkgICByZXBvcnQgaXRzZWxmIG9rYXkgYXMgYQoJCQkgICBzbGF2ZSB3aGVuIGl0IGlzIHJlYWxseSBhCgkJCSAgIG1hc3Rlci4gU28gdGhpcyBjaGVjayBhZ2FpbgoJCQkgICBhcyBhIG1hc3RlciBkZXZpY2UganVzdCB0bwoJCQkgICBtYWtlIHN1cmUgaXQgZG9lc24ndCByZXBvcnQKCQkJICAgaXRzZWxmIG9rYXkgYXMgYSBtYXN0ZXIgYWxzbwoJCQkqLwoJCQlpZiAoKG1hc3Rlcl9zbGF2ZSAmIEFUQV9BRERSRVNTX0RFVkhFQURfU0xBVkUpICYmCgkJCSAgICAhcmVjaGVja0FzTWFzdGVyKSB7CgkJCQlVU19ERUJVR1AoIiAgIElkZW50aWZpZWQgQVRBUEkgZGV2aWNlIGFzIHNsYXZlLiAgUmVjaGVja2luZyBhZ2FpbiBhcyBtYXN0ZXJcbiIpOwoJCQkJcmVjaGVja0FzTWFzdGVyID0gMTsKCQkJCW1hc3Rlcl9zbGF2ZSA9IEFUQV9BRERSRVNTX0RFVkhFQURfU1REOwoJCQl9IGVsc2UgewoJCQkJVVNfREVCVUdQKCIgICBJZGVudGlmaWVkIEFUQVBJIGRldmljZVxuIik7CgkJCQlpbmZvLT5EZXZpY2VIZWFkID0gbWFzdGVyX3NsYXZlOwoJCQkgICAgICAKCQkJCXN0YXR1cyA9IGlzZDIwMF9hdGFwaV9zb2Z0X3Jlc2V0KHVzKTsKCQkJCWJyZWFrOwoJCQl9CgkJfSBlbHNlIHsKIAkJCVVTX0RFQlVHUCgiICAgTm90IEFUQSwgbm90IEFUQVBJLiBXZWlyZC5cbiIpOwoJCQlicmVhazsKCQl9CgoJCS8qIGNoZWNrIGZvciB0aW1lb3V0IG9uIHRoaXMgcmVxdWVzdCAqLwoJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZFRpbWUpKSB7CgkJCWlmICghZGV0ZWN0KQoJCQkJVVNfREVCVUdQKCIgICBCU1kgY2hlY2sgdGltZW91dCwganVzdCBjb250aW51ZSB3aXRoIG5leHQgb3BlcmF0aW9uLi4uXG4iKTsKCQkJZWxzZQoJCQkJVVNfREVCVUdQKCIgICBEZXZpY2UgZGV0ZWN0IHRpbWVvdXQhXG4iKTsKCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiBzdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfbWFudWFsX2VudW0KICoJCQkJCQkJCQkgCiAqIERldGVybWluZXMgaWYgdGhlIGRyaXZlIGF0dGFjaGVkIGlzIGFuIEFUQSBvciBBVEFQSSBhbmQgaWYgaXQgaXMgYQogKiBtYXN0ZXIgb3Igc2xhdmUuCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfbWFudWFsX2VudW0oc3RydWN0IHVzX2RhdGEgKnVzKQp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX21hbnVhbF9lbnVtXG4iKTsKCglyZXRTdGF0dXMgPSBpc2QyMDBfcmVhZF9jb25maWcodXMpOwoJaWYgKHJldFN0YXR1cyA9PSBJU0QyMDBfR09PRCkgewoJCWludCBpc3NsYXZlOwoJCS8qIG1hc3RlciBvciBzbGF2ZT8gKi8KCQlyZXRTdGF0dXMgPSBpc2QyMDBfdHJ5X2VudW0oIHVzLCBBVEFfQUREUkVTU19ERVZIRUFEX1NURCwgMCk7CgkJaWYgKHJldFN0YXR1cyA9PSBJU0QyMDBfR09PRCkKCQkJcmV0U3RhdHVzID0gaXNkMjAwX3RyeV9lbnVtKCB1cywgQVRBX0FERFJFU1NfREVWSEVBRF9TTEFWRSwgMCk7CgoJCWlmIChyZXRTdGF0dXMgPT0gSVNEMjAwX0dPT0QpIHsKCQkJcmV0U3RhdHVzID0gaXNkMjAwX3Nyc3QodXMpOwoJCQlpZiAocmV0U3RhdHVzID09IElTRDIwMF9HT09EKQoJCQkJLyogYXRhIG9yIGF0YXBpPyAqLwoJCQkJcmV0U3RhdHVzID0gaXNkMjAwX3RyeV9lbnVtKCB1cywgQVRBX0FERFJFU1NfREVWSEVBRF9TVEQsIDEpOwoJCX0KCgkJaXNzbGF2ZSA9IChpbmZvLT5EZXZpY2VIZWFkICYgQVRBX0FERFJFU1NfREVWSEVBRF9TTEFWRSkgPyAxIDogMDsKCQlpZiAoIShpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyAmIEFUQUNGR19NQVNURVIpKSB7CgkJCVVTX0RFQlVHUCgiICAgU2V0dGluZyBNYXN0ZXIvU2xhdmUgc2VsZWN0aW9uIHRvICVkXG4iLCBpc3NsYXZlKTsKCQkJaW5mby0+Q29uZmlnRGF0YS5BVEFDb25maWcgJj0gMHgzZjsKCQkJaW5mby0+Q29uZmlnRGF0YS5BVEFDb25maWcgfD0gKGlzc2xhdmU8PDYpOwoJCQlyZXRTdGF0dXMgPSBpc2QyMDBfd3JpdGVfY29uZmlnKHVzKTsKCQl9Cgl9CgoJVVNfREVCVUdQKCJMZWF2aW5nIGlzZDIwMF9tYW51YWxfZW51bSAlMDhYXG4iLCByZXRTdGF0dXMpOwoJcmV0dXJuKHJldFN0YXR1cyk7Cn0KCnN0YXRpYyB2b2lkIGlzZDIwMF9maXhfZHJpdmVpZCh1MTYgKmlkKQp7CiNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCiMgaWZkZWYgX19CSUdfRU5ESUFOCglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgQVRBX0lEX1dPUkRTOyBpKyspCgkJaWRbaV0gPSBfX2xlMTZfdG9fY3B1KGlkW2ldKTsKIyBlbHNlCiMgIGVycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgojIGVuZGlmCiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBpc2QyMDBfZHVtcF9kcml2ZWlkKHUxNiAqaWQpCnsKCVVTX0RFQlVHUCgiICAgSWRlbnRpZnkgRGF0YSBTdHJ1Y3R1cmU6XG4iKTsKCVVTX0RFQlVHUCgiICAgICAgY29uZmlnID0gMHgleFxuIiwJICBpZFtBVEFfSURfQ09ORklHXSk7CglVU19ERUJVR1AoIiAgICAgIGN5bHMgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9DWUxTXSk7CglVU19ERUJVR1AoIiAgICAgIGhlYWRzID0gMHgleFxuIiwJICBpZFtBVEFfSURfSEVBRFNdKTsKCVVTX0RFQlVHUCgiICAgICAgdHJhY2tfYnl0ZXMgPSAweCV4XG4iLAkgIGlkWzRdKTsKCVVTX0RFQlVHUCgiICAgICAgc2VjdG9yX2J5dGVzID0gMHgleFxuIiwgIGlkWzVdKTsKCVVTX0RFQlVHUCgiICAgICAgc2VjdG9ycyA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX1NFQ1RPUlNdKTsKCVVTX0RFQlVHUCgiICAgICAgc2VyaWFsX25vWzBdID0gMHgleFxuIiwgICooY2hhciAqKSZpZFtBVEFfSURfU0VSTk9dKTsKCVVTX0RFQlVHUCgiICAgICAgYnVmX3R5cGUgPSAweCV4XG4iLAkgIGlkWzIwXSk7CglVU19ERUJVR1AoIiAgICAgIGJ1Zl9zaXplID0gMHgleFxuIiwJICBpZFtBVEFfSURfQlVGX1NJWkVdKTsKCVVTX0RFQlVHUCgiICAgICAgZWNjX2J5dGVzID0gMHgleFxuIiwJICBpZFsyMl0pOwoJVVNfREVCVUdQKCIgICAgICBmd19yZXZbMF0gPSAweCV4XG4iLAkgICooY2hhciAqKSZpZFtBVEFfSURfRldfUkVWXSk7CglVU19ERUJVR1AoIiAgICAgIG1vZGVsWzBdID0gMHgleFxuIiwJICAqKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdKTsKCVVTX0RFQlVHUCgiICAgICAgbWF4X211bHRzZWN0ID0gMHgleFxuIiwgIGlkW0FUQV9JRF9NQVhfTVVMVFNFQ1RdICYgMHhmZik7CglVU19ERUJVR1AoIiAgICAgIGR3b3JkX2lvID0gMHgleFxuIiwJICBpZFtBVEFfSURfRFdPUkRfSU9dKTsKCVVTX0RFQlVHUCgiICAgICAgY2FwYWJpbGl0eSA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0NBUEFCSUxJVFldID4+IDgpOwoJVVNfREVCVUdQKCIgICAgICB0UElPID0gMHgleFxuIiwJICBpZFtBVEFfSURfT0xEX1BJT19NT0RFU10gPj4gOCk7CglVU19ERUJVR1AoIiAgICAgIHRETUEgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9PTERfRE1BX01PREVTXSA+PiA4KTsKCVVTX0RFQlVHUCgiICAgICAgZmllbGRfdmFsaWQgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0pOwoJVVNfREVCVUdQKCIgICAgICBjdXJfY3lscyA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0NVUl9DWUxTXSk7CglVU19ERUJVR1AoIiAgICAgIGN1cl9oZWFkcyA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0NVUl9IRUFEU10pOwoJVVNfREVCVUdQKCIgICAgICBjdXJfc2VjdG9ycyA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0NVUl9TRUNUT1JTXSk7CglVU19ERUJVR1AoIiAgICAgIGN1cl9jYXBhY2l0eSA9IDB4JXhcbiIsICBhdGFfaWRfdTMyKGlkLCA1NykpOwoJVVNfREVCVUdQKCIgICAgICBtdWx0c2VjdCA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX01VTFRTRUNUXSAmIDB4ZmYpOwoJVVNfREVCVUdQKCIgICAgICBsYmFfY2FwYWNpdHkgPSAweCV4XG4iLCAgYXRhX2lkX3UzMihpZCwgQVRBX0lEX0xCQV9DQVBBQ0lUWSkpOwoJVVNfREVCVUdQKCIgICAgICBjb21tYW5kX3NldF8xID0gMHgleFxuIiwgaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzFdKTsKCVVTX0RFQlVHUCgiICAgICAgY29tbWFuZF9zZXRfMiA9IDB4JXhcbiIsIGlkW0FUQV9JRF9DT01NQU5EX1NFVF8yXSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfZ2V0X2lucXVpcnlfZGF0YQogKgogKiBHZXQgaW5xdWlyeSBkYXRhCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfZ2V0X2lucXVpcnlfZGF0YSggc3RydWN0IHVzX2RhdGEgKnVzICkKewoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvID0gKHN0cnVjdCBpc2QyMDBfaW5mbyAqKXVzLT5leHRyYTsKCWludCByZXRTdGF0dXMgPSBJU0QyMDBfR09PRDsKCXUxNiAqaWQgPSBpbmZvLT5pZDsKCglVU19ERUJVR1AoIkVudGVyaW5nIGlzZDIwMF9nZXRfaW5xdWlyeV9kYXRhXG4iKTsKCgkvKiBzZXQgZGVmYXVsdCB0byBNYXN0ZXIgKi8KCWluZm8tPkRldmljZUhlYWQgPSBBVEFfQUREUkVTU19ERVZIRUFEX1NURDsKCgkvKiBhdHRlbXB0IHRvIG1hbnVhbGx5IGVudW1lcmF0ZSB0aGlzIGRldmljZSAqLwoJcmV0U3RhdHVzID0gaXNkMjAwX21hbnVhbF9lbnVtKHVzKTsKCWlmIChyZXRTdGF0dXMgPT0gSVNEMjAwX0dPT0QpIHsKCQlpbnQgdHJhbnNmZXJTdGF0dXM7CgoJCS8qIGNoZWNrIGZvciBhbiBBVEEgZGV2aWNlICovCgkJaWYgKGluZm8tPkRldmljZUZsYWdzICYgREZfQVRBX0RFVklDRSkgewoJCQkvKiB0aGlzIG11c3QgYmUgYW4gQVRBIGRldmljZSAqLwoJCQkvKiBwZXJmb3JtIGFuIEFUQSBDb21tYW5kIElkZW50aWZ5ICovCgkJCXRyYW5zZmVyU3RhdHVzID0gaXNkMjAwX2FjdGlvbiggdXMsIEFDVElPTl9JREVOVElGWSwKCQkJCQkJCWlkLCBBVEFfSURfV09SRFMgKiAyKTsKCQkJaWYgKHRyYW5zZmVyU3RhdHVzICE9IElTRDIwMF9UUkFOU1BPUlRfR09PRCkgewoJCQkJLyogRXJyb3IgaXNzdWluZyBBVEEgQ29tbWFuZCBJZGVudGlmeSAqLwoJCQkJVVNfREVCVUdQKCIgICBFcnJvciBpc3N1aW5nIEFUQSBDb21tYW5kIElkZW50aWZ5XG4iKTsKCQkJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCQkJfSBlbHNlIHsKCQkJCS8qIEFUQSBDb21tYW5kIElkZW50aWZ5IHN1Y2Nlc3NmdWwgKi8KCQkJCWludCBpOwoJCQkJX19iZTE2ICpzcmM7CgkJCQlfX3UxNiAqZGVzdDsKCgkJCQlpc2QyMDBfZml4X2RyaXZlaWQoaWQpOwoJCQkJaXNkMjAwX2R1bXBfZHJpdmVpZChpZCk7CgoJCQkJbWVtc2V0KCZpbmZvLT5JbnF1aXJ5RGF0YSwgMCwgc2l6ZW9mKGluZm8tPklucXVpcnlEYXRhKSk7CgoJCQkJLyogU3RhbmRhcmQgSURFIGludGVyZmFjZSBvbmx5IHN1cHBvcnRzIGRpc2tzICovCgkJCQlpbmZvLT5JbnF1aXJ5RGF0YS5EZXZpY2VUeXBlID0gRElSRUNUX0FDQ0VTU19ERVZJQ0U7CgoJCQkJLyogVGhlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDM2ICg1ICsgMzEpICovCgkJCQlpbmZvLT5JbnF1aXJ5RGF0YS5BZGRpdGlvbmFsTGVuZ3RoID0gMHgxRjsKCgkJCQlpZiAoaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzFdICYgQ09NTUFORFNFVF9NRURJQV9TVEFUVVMpIHsKCQkJCQkvKiBzZXQgdGhlIHJlbW92YWJsZSBiaXQgKi8KCQkJCQlpbmZvLT5JbnF1aXJ5RGF0YS5EZXZpY2VUeXBlTW9kaWZpZXIgPSBERVZJQ0VfUkVNT1ZBQkxFOwoJCQkJCWluZm8tPkRldmljZUZsYWdzIHw9IERGX1JFTU9WQUJMRV9NRURJQTsKCQkJCX0KCgkJCQkvKiBGaWxsIGluIHZlbmRvciBpZGVudGlmaWNhdGlvbiBmaWVsZHMgKi8KCQkJCXNyYyA9IChfX2JlMTYgKikmaWRbQVRBX0lEX1BST0RdOwoJCQkJZGVzdCA9IChfX3UxNiopaW5mby0+SW5xdWlyeURhdGEuVmVuZG9ySWQ7CgkJCQlmb3IgKGk9MDtpPDQ7aSsrKQoJCQkJCWRlc3RbaV0gPSBiZTE2X3RvX2NwdShzcmNbaV0pOwoKCQkJCXNyYyA9IChfX2JlMTYgKikmaWRbQVRBX0lEX1BST0QgKyA4LzJdOwoJCQkJZGVzdCA9IChfX3UxNiopaW5mby0+SW5xdWlyeURhdGEuUHJvZHVjdElkOwoJCQkJZm9yIChpPTA7aTw4O2krKykKCQkJCQlkZXN0W2ldID0gYmUxNl90b19jcHUoc3JjW2ldKTsKCgkJCQlzcmMgPSAoX19iZTE2ICopJmlkW0FUQV9JRF9GV19SRVZdOwoJCQkJZGVzdCA9IChfX3UxNiopaW5mby0+SW5xdWlyeURhdGEuUHJvZHVjdFJldmlzaW9uTGV2ZWw7CgkJCQlmb3IgKGk9MDtpPDI7aSsrKQoJCQkJCWRlc3RbaV0gPSBiZTE2X3RvX2NwdShzcmNbaV0pOwoKCQkJCS8qIGRldGVybWluZSBpZiBpdCBzdXBwb3J0cyBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uICovCgkJCQlpZiAoaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzJdICYgQ09NTUFORFNFVF9NRURJQV9TVEFUVVMpIHsKCQkJCQlVU19ERUJVR1AoIiAgIERldmljZSBzdXBwb3J0cyBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uXG4iKTsKCgkJCQkJLyogSW5kaWNhdGUgdGhhdCBpdCBpcyBlbmFibGVkLCBldmVuIHRob3VnaCBpdCBpcyBub3QKCQkJCQkgKiBUaGlzIGFsbG93cyB0aGUgbG9jay91bmxvY2sgb2YgdGhlIG1lZGlhIHRvIHdvcmsKCQkJCQkgKiBjb3JyZWN0bHkuCgkJCQkJICovCgkJCQkJaW5mby0+RGV2aWNlRmxhZ3MgfD0gREZfTUVESUFfU1RBVFVTX0VOQUJMRUQ7CgkJCQl9CgkJCQllbHNlCgkJCQkJaW5mby0+RGV2aWNlRmxhZ3MgJj0gfkRGX01FRElBX1NUQVRVU19FTkFCTEVEOwoKCQkJfQoJCX0gZWxzZSB7CgkJCS8qIAoJCQkgKiB0aGlzIG11c3QgYmUgYW4gQVRBUEkgZGV2aWNlIAoJCQkgKiB1c2UgYW4gQVRBUEkgcHJvdG9jb2wgKFRyYW5zcGFyZW50IFNDU0kpCgkJCSAqLwoJCQl1cy0+cHJvdG9jb2xfbmFtZSA9ICJUcmFuc3BhcmVudCBTQ1NJIjsKCQkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl90cmFuc3BhcmVudF9zY3NpX2NvbW1hbmQ7CgoJCQlVU19ERUJVR1AoIlByb3RvY29sIGNoYW5nZWQgdG86ICVzXG4iLCB1cy0+cHJvdG9jb2xfbmFtZSk7CgkgICAgCgkJCS8qIEZyZWUgZHJpdmVyIHN0cnVjdHVyZSAqLwkgICAgCgkJCXVzLT5leHRyYV9kZXN0cnVjdG9yKGluZm8pOwoJCQlrZnJlZShpbmZvKTsKCQkJdXMtPmV4dHJhID0gTlVMTDsKCQkJdXMtPmV4dHJhX2Rlc3RydWN0b3IgPSBOVUxMOwoJCX0KCX0KCglVU19ERUJVR1AoIkxlYXZpbmcgaXNkMjAwX2dldF9pbnF1aXJ5X2RhdGEgJTA4WFxuIiwgcmV0U3RhdHVzKTsKCglyZXR1cm4ocmV0U3RhdHVzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9zY3NpX3RvX2F0YQogKgkJCQkJCQkJCSAKICogVHJhbnNsYXRlIFNDU0kgY29tbWFuZHMgdG8gQVRBIGNvbW1hbmRzLgogKgogKiBSRVRVUk5TOgogKiAgICAxIGlmIHRoZSBjb21tYW5kIG5lZWRzIHRvIGJlIHNlbnQgdG8gdGhlIHRyYW5zcG9ydCBsYXllcgogKiAgICAwIG90aGVyd2lzZQogKi8Kc3RhdGljIGludCBpc2QyMDBfc2NzaV90b19hdGEoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMsCgkJCSAgICAgIHVuaW9uIGF0YV9jZGIgKiBhdGFDZGIpCnsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7Cgl1MTYgKmlkID0gaW5mby0+aWQ7CglpbnQgc2VuZFRvVHJhbnNwb3J0ID0gMTsKCXVuc2lnbmVkIGNoYXIgc2VjdG51bSwgaGVhZDsKCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyOwoJdW5zaWduZWQgbG9uZyBsYmE7Cgl1bnNpZ25lZCBsb25nIGJsb2NrQ291bnQ7Cgl1bnNpZ25lZCBjaGFyIHNlbnNlRGF0YVs4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwoKCW1lbXNldChhdGFDZGIsIDAsIHNpemVvZih1bmlvbiBhdGFfY2RiKSk7CgoJLyogU0NTSSBDb21tYW5kICovCglzd2l0Y2ggKHNyYi0+Y21uZFswXSkgewoJY2FzZSBJTlFVSVJZOgoJCVVTX0RFQlVHUCgiICAgQVRBIE9VVCAtIElOUVVJUllcbiIpOwoKCQkvKiBjb3B5IElucXVpcnlEYXRhICovCgkJdXNiX3N0b3Jfc2V0X3hmZXJfYnVmKCh1bnNpZ25lZCBjaGFyICopICZpbmZvLT5JbnF1aXJ5RGF0YSwKCQkJCXNpemVvZihpbmZvLT5JbnF1aXJ5RGF0YSksIHNyYik7CgkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwoJCXNlbmRUb1RyYW5zcG9ydCA9IDA7CgkJYnJlYWs7CgoJY2FzZSBNT0RFX1NFTlNFOgoJCVVTX0RFQlVHUCgiICAgQVRBIE9VVCAtIFNDU0lPUF9NT0RFX1NFTlNFXG4iKTsKCgkJLyogSW5pdGlhbGl6ZSB0aGUgcmV0dXJuIGJ1ZmZlciAqLwoJCXVzYl9zdG9yX3NldF94ZmVyX2J1ZihzZW5zZURhdGEsIHNpemVvZihzZW5zZURhdGEpLCBzcmIpOwoKCQlpZiAoaW5mby0+RGV2aWNlRmxhZ3MgJiBERl9NRURJQV9TVEFUVVNfRU5BQkxFRCkKCQl7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMCA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTEgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1pbm9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlRyYW5zZmVyQmxvY2tTaXplID0gMTsKCQkJYXRhQ2RiLT5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0NPTU1BTkQ7CgkJCWF0YUNkYi0+d3JpdGUuQ29tbWFuZEJ5dGUgPSBBVEFfQ09NTUFORF9HRVRfTUVESUFfU1RBVFVTOwoJCQlpc2QyMDBfc3JiX3NldF9idWZmbGVuKHNyYiwgMCk7CgkJfSBlbHNlIHsKCQkJVVNfREVCVUdQKCIgICBNZWRpYSBTdGF0dXMgbm90IHN1cHBvcnRlZCwganVzdCByZXBvcnQgb2theVxuIik7CgkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQkJc2VuZFRvVHJhbnNwb3J0ID0gMDsKCQl9CgkJYnJlYWs7CgoJY2FzZSBURVNUX1VOSVRfUkVBRFk6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX1RFU1RfVU5JVF9SRUFEWVxuIik7CgoJCWlmIChpbmZvLT5EZXZpY2VGbGFncyAmIERGX01FRElBX1NUQVRVU19FTkFCTEVEKQoJCXsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUwID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNYWpvckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCQlhdGFDZGItPmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfQ09NTUFORDsKCQkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DT01NQU5EX0dFVF9NRURJQV9TVEFUVVM7CgkJCWlzZDIwMF9zcmJfc2V0X2J1ZmZsZW4oc3JiLCAwKTsKCQl9IGVsc2UgewoJCQlVU19ERUJVR1AoIiAgIE1lZGlhIFN0YXR1cyBub3Qgc3VwcG9ydGVkLCBqdXN0IHJlcG9ydCBva2F5XG4iKTsKCQkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwoJCQlzZW5kVG9UcmFuc3BvcnQgPSAwOwoJCX0KCQlicmVhazsKCgljYXNlIFJFQURfQ0FQQUNJVFk6Cgl7CgkJdW5zaWduZWQgbG9uZyBjYXBhY2l0eTsKCQlzdHJ1Y3QgcmVhZF9jYXBhY2l0eV9kYXRhIHJlYWRDYXBhY2l0eURhdGE7CgoJCVVTX0RFQlVHUCgiICAgQVRBIE9VVCAtIFNDU0lPUF9SRUFEX0NBUEFDSVRZXG4iKTsKCgkJaWYgKGF0YV9pZF9oYXNfbGJhKGlkKSkKCQkJY2FwYWNpdHkgPSBhdGFfaWRfdTMyKGlkLCBBVEFfSURfTEJBX0NBUEFDSVRZKSAtIDE7CgkJZWxzZQoJCQljYXBhY2l0eSA9IChpZFtBVEFfSURfSEVBRFNdICogaWRbQVRBX0lEX0NZTFNdICoKCQkJCSAgICBpZFtBVEFfSURfU0VDVE9SU10pIC0gMTsKCgkJcmVhZENhcGFjaXR5RGF0YS5Mb2dpY2FsQmxvY2tBZGRyZXNzID0gY3B1X3RvX2JlMzIoY2FwYWNpdHkpOwoJCXJlYWRDYXBhY2l0eURhdGEuQnl0ZXNQZXJCbG9jayA9IGNwdV90b19iZTMyKDB4MjAwKTsKCgkJdXNiX3N0b3Jfc2V0X3hmZXJfYnVmKCh1bnNpZ25lZCBjaGFyICopICZyZWFkQ2FwYWNpdHlEYXRhLAoJCQkJc2l6ZW9mKHJlYWRDYXBhY2l0eURhdGEpLCBzcmIpOwoJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQlzZW5kVG9UcmFuc3BvcnQgPSAwOwoJfQoJYnJlYWs7CgoJY2FzZSBSRUFEXzEwOgoJCVVTX0RFQlVHUCgiICAgQVRBIE9VVCAtIFNDU0lPUF9SRUFEXG4iKTsKCgkJbGJhID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikmc3JiLT5jbW5kWzJdKTsKCQlibG9ja0NvdW50ID0gKHVuc2lnbmVkIGxvbmcpc3JiLT5jbW5kWzddPDw4IHwgKHVuc2lnbmVkIGxvbmcpc3JiLT5jbW5kWzhdOwoKCQlpZiAoYXRhX2lkX2hhc19sYmEoaWQpKSB7CgkJCXNlY3RudW0gPSAodW5zaWduZWQgY2hhcikobGJhKTsKCQkJY3lsaW5kZXIgPSAodW5zaWduZWQgc2hvcnQpKGxiYT4+OCk7CgkJCWhlYWQgPSBBVEFfQUREUkVTU19ERVZIRUFEX0xCQV9NT0RFIHwgKHVuc2lnbmVkIGNoYXIpKGxiYT4+MjQgJiAweDBGKTsKCQl9IGVsc2UgewoJCQlzZWN0bnVtID0gKHU4KSgobGJhICUgaWRbQVRBX0lEX1NFQ1RPUlNdKSArIDEpOwoJCQljeWxpbmRlciA9ICh1MTYpKGxiYSAvIChpZFtBVEFfSURfU0VDVE9SU10gKgoJCQkJCWlkW0FUQV9JRF9IRUFEU10pKTsKCQkJaGVhZCA9ICh1OCkoKGxiYSAvIGlkW0FUQV9JRF9TRUNUT1JTXSkgJQoJCQkJCWlkW0FUQV9JRF9IRUFEU10pOwoJCX0KCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTEgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1pbm9yQ29tbWFuZDsKCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCWF0YUNkYi0+Z2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9CgkJICBSRUdfU0VDVE9SX0NPVU5UIHwgUkVHX1NFQ1RPUl9OVU1CRVIgfAoJCSAgUkVHX0NZTElOREVSX0xPVyB8IFJFR19DWUxJTkRFUl9ISUdIIHwKCQkgIFJFR19ERVZJQ0VfSEVBRCAgfCBSRUdfQ09NTUFORDsKCQlhdGFDZGItPndyaXRlLlNlY3RvckNvdW50Qnl0ZSA9ICh1bnNpZ25lZCBjaGFyKWJsb2NrQ291bnQ7CgkJYXRhQ2RiLT53cml0ZS5TZWN0b3JOdW1iZXJCeXRlID0gc2VjdG51bTsKCQlhdGFDZGItPndyaXRlLkN5bGluZGVySGlnaEJ5dGUgPSAodW5zaWduZWQgY2hhcikoY3lsaW5kZXI+PjgpOwoJCWF0YUNkYi0+d3JpdGUuQ3lsaW5kZXJMb3dCeXRlID0gKHVuc2lnbmVkIGNoYXIpY3lsaW5kZXI7CgkJYXRhQ2RiLT53cml0ZS5EZXZpY2VIZWFkQnl0ZSA9IChoZWFkIHwgQVRBX0FERFJFU1NfREVWSEVBRF9TVEQpOwoJCWF0YUNkYi0+d3JpdGUuQ29tbWFuZEJ5dGUgPSBBVEFfQ01EX1BJT19SRUFEOwoJCWJyZWFrOwoKCWNhc2UgV1JJVEVfMTA6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX1dSSVRFXG4iKTsKCgkJbGJhID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikmc3JiLT5jbW5kWzJdKTsKCQlibG9ja0NvdW50ID0gKHVuc2lnbmVkIGxvbmcpc3JiLT5jbW5kWzddPDw4IHwgKHVuc2lnbmVkIGxvbmcpc3JiLT5jbW5kWzhdOwoKCQlpZiAoYXRhX2lkX2hhc19sYmEoaWQpKSB7CgkJCXNlY3RudW0gPSAodW5zaWduZWQgY2hhcikobGJhKTsKCQkJY3lsaW5kZXIgPSAodW5zaWduZWQgc2hvcnQpKGxiYT4+OCk7CgkJCWhlYWQgPSBBVEFfQUREUkVTU19ERVZIRUFEX0xCQV9NT0RFIHwgKHVuc2lnbmVkIGNoYXIpKGxiYT4+MjQgJiAweDBGKTsKCQl9IGVsc2UgewoJCQlzZWN0bnVtID0gKHU4KSgobGJhICUgaWRbQVRBX0lEX1NFQ1RPUlNdKSArIDEpOwoJCQljeWxpbmRlciA9ICh1MTYpKGxiYSAvIChpZFtBVEFfSURfU0VDVE9SU10gKgoJCQkJCWlkW0FUQV9JRF9IRUFEU10pKTsKCQkJaGVhZCA9ICh1OCkoKGxiYSAvIGlkW0FUQV9JRF9TRUNUT1JTXSkgJQoJCQkJCWlkW0FUQV9JRF9IRUFEU10pOwoJCX0KCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTEgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1pbm9yQ29tbWFuZDsKCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCWF0YUNkYi0+Z2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9CgkJICBSRUdfU0VDVE9SX0NPVU5UIHwgUkVHX1NFQ1RPUl9OVU1CRVIgfAoJCSAgUkVHX0NZTElOREVSX0xPVyB8IFJFR19DWUxJTkRFUl9ISUdIIHwKCQkgIFJFR19ERVZJQ0VfSEVBRCAgfCBSRUdfQ09NTUFORDsKCQlhdGFDZGItPndyaXRlLlNlY3RvckNvdW50Qnl0ZSA9ICh1bnNpZ25lZCBjaGFyKWJsb2NrQ291bnQ7CgkJYXRhQ2RiLT53cml0ZS5TZWN0b3JOdW1iZXJCeXRlID0gc2VjdG51bTsKCQlhdGFDZGItPndyaXRlLkN5bGluZGVySGlnaEJ5dGUgPSAodW5zaWduZWQgY2hhcikoY3lsaW5kZXI+PjgpOwoJCWF0YUNkYi0+d3JpdGUuQ3lsaW5kZXJMb3dCeXRlID0gKHVuc2lnbmVkIGNoYXIpY3lsaW5kZXI7CgkJYXRhQ2RiLT53cml0ZS5EZXZpY2VIZWFkQnl0ZSA9IChoZWFkIHwgQVRBX0FERFJFU1NfREVWSEVBRF9TVEQpOwoJCWF0YUNkYi0+d3JpdGUuQ29tbWFuZEJ5dGUgPSBBVEFfQ01EX1BJT19XUklURTsKCQlicmVhazsKCgljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgoJCVVTX0RFQlVHUCgiICAgQVRBIE9VVCAtIFNDU0lPUF9NRURJVU1fUkVNT1ZBTFxuIik7CgoJCWlmIChpbmZvLT5EZXZpY2VGbGFncyAmIERGX1JFTU9WQUJMRV9NRURJQSkgewoJCQlVU19ERUJVR1AoIiAgIHNyYi0+Y21uZFs0XSA9IDB4JVhcbiIsIHNyYi0+Y21uZFs0XSk7CgkgICAgCgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMCA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTEgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1pbm9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlRyYW5zZmVyQmxvY2tTaXplID0gMTsKCQkJYXRhQ2RiLT5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0NPTU1BTkQ7CgkJCWF0YUNkYi0+d3JpdGUuQ29tbWFuZEJ5dGUgPSAoc3JiLT5jbW5kWzRdICYgMHgxKSA/CgkJCQlBVEFfQ01EX01FRElBX0xPQ0sgOiBBVEFfQ01EX01FRElBX1VOTE9DSzsKCQkJaXNkMjAwX3NyYl9zZXRfYnVmZmxlbihzcmIsIDApOwoJCX0gZWxzZSB7CgkJCVVTX0RFQlVHUCgiICAgTm90IHJlbW92ZWFibGUgbWVkaWEsIGp1c3QgcmVwb3J0IG9rYXlcbiIpOwoJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CgkJCXNlbmRUb1RyYW5zcG9ydCA9IDA7CgkJfQoJCWJyZWFrOwoKCWNhc2UgU1RBUlRfU1RPUDogICAgCgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX1NUQVJUX1NUT1BfVU5JVFxuIik7CgkJVVNfREVCVUdQKCIgICBzcmItPmNtbmRbNF0gPSAweCVYXG4iLCBzcmItPmNtbmRbNF0pOwoKCQlpZiAoKHNyYi0+Y21uZFs0XSAmIDB4MykgPT0gMHgyKSB7CgkJCVVTX0RFQlVHUCgiICAgTWVkaWEgRWplY3RcbiIpOwoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUxID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNaW5vckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDA7CgkJCWF0YUNkYi0+Z2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19DT01NQU5EOwoJCQlhdGFDZGItPndyaXRlLkNvbW1hbmRCeXRlID0gQVRBX0NPTU1BTkRfTUVESUFfRUpFQ1Q7CgkJfSBlbHNlIGlmICgoc3JiLT5jbW5kWzRdICYgMHgzKSA9PSAweDEpIHsKCQkJVVNfREVCVUdQKCIgICBHZXQgTWVkaWEgU3RhdHVzXG4iKTsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUwID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNYWpvckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCQlhdGFDZGItPmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfQ09NTUFORDsKCQkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DT01NQU5EX0dFVF9NRURJQV9TVEFUVVM7CgkJCWlzZDIwMF9zcmJfc2V0X2J1ZmZsZW4oc3JiLCAwKTsKCQl9IGVsc2UgewoJCQlVU19ERUJVR1AoIiAgIE5vdGhpbmcgdG8gZG8sIGp1c3QgcmVwb3J0IG9rYXlcbiIpOwoJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CgkJCXNlbmRUb1RyYW5zcG9ydCA9IDA7CgkJfQoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJVVNfREVCVUdQKCJVbnN1cHBvcnRlZCBTQ1NJIGNvbW1hbmQgLSAweCVYXG4iLCBzcmItPmNtbmRbMF0pOwoJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwoJCXNlbmRUb1RyYW5zcG9ydCA9IDA7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuKHNlbmRUb1RyYW5zcG9ydCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX2ZyZWVfaW5mbwogKgogKiBGcmVlcyB0aGUgZHJpdmVyIHN0cnVjdHVyZS4KICovCnN0YXRpYyB2b2lkIGlzZDIwMF9mcmVlX2luZm9fcHRycyh2b2lkICppbmZvXykKewoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvID0gKHN0cnVjdCBpc2QyMDBfaW5mbyAqKSBpbmZvXzsKCglpZiAoaW5mbykgewoJCWtmcmVlKGluZm8tPmlkKTsKCQlrZnJlZShpbmZvLT5SZWdzQnVmKTsKCQlrZnJlZShpbmZvLT5zcmIuc2Vuc2VfYnVmZmVyKTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9pbml0X2luZm8KICoJCQkJCQkJCQkgCiAqIEFsbG9jYXRlcyAoaWYgbmVjZXNzYXJ5KSBhbmQgaW5pdGlhbGl6ZXMgdGhlIGRyaXZlciBzdHJ1Y3R1cmUuCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfaW5pdF9pbmZvKHN0cnVjdCB1c19kYXRhICp1cykKewoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvOwoKCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXNkMjAwX2luZm8pLCBHRlBfS0VSTkVMKTsKCWlmICghaW5mbykKCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7CgllbHNlIHsKCQlpbmZvLT5pZCA9IGt6YWxsb2MoQVRBX0lEX1dPUkRTICogMiwgR0ZQX0tFUk5FTCk7CgkJaW5mby0+UmVnc0J1ZiA9ICh1bnNpZ25lZCBjaGFyICopCgkJCQlrbWFsbG9jKHNpemVvZihpbmZvLT5BVEFSZWdzKSwgR0ZQX0tFUk5FTCk7CgkJaW5mby0+c3JiLnNlbnNlX2J1ZmZlciA9CgkJCQlrbWFsbG9jKFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgR0ZQX0tFUk5FTCk7CgkJaWYgKCFpbmZvLT5pZCB8fCAhaW5mby0+UmVnc0J1ZiB8fCAhaW5mby0+c3JiLnNlbnNlX2J1ZmZlcikgewoJCQlpc2QyMDBfZnJlZV9pbmZvX3B0cnMoaW5mbyk7CgkJCWtmcmVlKGluZm8pOwoJCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7CgkJfQoJfQoKCWlmIChyZXRTdGF0dXMgPT0gSVNEMjAwX0dPT0QpIHsKCQl1cy0+ZXh0cmEgPSBpbmZvOwoJCXVzLT5leHRyYV9kZXN0cnVjdG9yID0gaXNkMjAwX2ZyZWVfaW5mb19wdHJzOwoJfSBlbHNlCgkJVVNfREVCVUdQKCJFUlJPUiAtIGttYWxsb2MgZmFpbHVyZVxuIik7CgoJcmV0dXJuIHJldFN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEluaXRpYWxpemF0aW9uIGZvciB0aGUgSVNEMjAwIAogKi8KCnN0YXRpYyBpbnQgaXNkMjAwX0luaXRpYWxpemF0aW9uKHN0cnVjdCB1c19kYXRhICp1cykKewoJVVNfREVCVUdQKCJJU0QyMDAgSW5pdGlhbGl6YXRpb24uLi5cbiIpOwoKCS8qIEluaXRpYWxpemUgSVNEMjAwIGluZm8gc3RydWN0ICovCgoJaWYgKGlzZDIwMF9pbml0X2luZm8odXMpID09IElTRDIwMF9FUlJPUikgewoJCVVTX0RFQlVHUCgiRVJST1IgSW5pdGlhbGl6aW5nIElTRDIwMCBJbmZvIHN0cnVjdFxuIik7Cgl9IGVsc2UgewoJCS8qIEdldCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSAqLwoKCQlpZiAoaXNkMjAwX2dldF9pbnF1aXJ5X2RhdGEodXMpICE9IElTRDIwMF9HT09EKQoJCQlVU19ERUJVR1AoIklTRDIwMCBJbml0aWFsaXphdGlvbiBGYWlsdXJlXG4iKTsKCQllbHNlCgkJCVVTX0RFQlVHUCgiSVNEMjAwIEluaXRpYWxpemF0aW9uIGNvbXBsZXRlXG4iKTsKCX0KCglyZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQcm90b2NvbCBhbmQgVHJhbnNwb3J0IGZvciB0aGUgSVNEMjAwIEFTSUMKICoKICogVGhpcyBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGFyZSBmb3IgQVRBIGRldmljZXMgY29ubmVjdGVkIHRvIGFuIElTRDIwMAogKiBBU0lDLiAgQW4gQVRBUEkgZGV2aWNlIHRoYXQgaXMgY29uZWN0ZWQgYXMgYSBzbGF2ZSBkZXZpY2Ugd2lsbCBiZQogKiBkZXRlY3RlZCBpbiB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGFuZCB0aGUgcHJvdG9jb2wgd2lsbAogKiBiZSBjaGFuZ2VkIHRvIGFuIEFUQVBJIHByb3RvY29sIChUcmFuc3BhcmVudCBTQ1NJKS4KICoKICovCgpzdGF0aWMgdm9pZCBpc2QyMDBfYXRhX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCWludCBzZW5kVG9UcmFuc3BvcnQgPSAxLCBvcmlnX2J1ZmZsZW47Cgl1bmlvbiBhdGFfY2RiIGF0YUNkYjsKCgkvKiBNYWtlIHN1cmUgZHJpdmVyIHdhcyBpbml0aWFsaXplZCAqLwoKCWlmICh1cy0+ZXh0cmEgPT0gTlVMTCkKCQlVU19ERUJVR1AoIkVSUk9SIERyaXZlciBub3QgaW5pdGlhbGl6ZWRcbiIpOwoKCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CgkvKiBzY3NpX2J1ZmZsZW4gbWlnaHQgY2hhbmdlIGluIHByb3RvY29sIHRyYW5zbGF0aW9uIHRvIGF0YSAqLwoJb3JpZ19idWZmbGVuID0gc2NzaV9idWZmbGVuKHNyYik7CglzZW5kVG9UcmFuc3BvcnQgPSBpc2QyMDBfc2NzaV90b19hdGEoc3JiLCB1cywgJmF0YUNkYik7CgoJLyogc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgdHJhbnNwb3J0IGxheWVyICovCglpZiAoc2VuZFRvVHJhbnNwb3J0KQoJCWlzZDIwMF9pbnZva2VfdHJhbnNwb3J0KHVzLCBzcmIsICZhdGFDZGIpOwoKCWlzZDIwMF9zcmJfc2V0X2J1ZmZsZW4oc3JiLCBvcmlnX2J1ZmZsZW4pOwp9CgpzdGF0aWMgaW50IGlzZDIwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJc3RydWN0IHVzX2RhdGEgKnVzOwoJaW50IHJlc3VsdDsKCglyZXN1bHQgPSB1c2Jfc3Rvcl9wcm9iZTEoJnVzLCBpbnRmLCBpZCwKCQkJKGlkIC0gaXNkMjAwX3VzYl9pZHMpICsgaXNkMjAwX3VudXN1YWxfZGV2X2xpc3QpOwoJaWYgKHJlc3VsdCkKCQlyZXR1cm4gcmVzdWx0OwoKCXVzLT5wcm90b2NvbF9uYW1lID0gIklTRDIwMCBBVEEvQVRBUEkiOwoJdXMtPnByb3RvX2hhbmRsZXIgPSBpc2QyMDBfYXRhX2NvbW1hbmQ7CgoJcmVzdWx0ID0gdXNiX3N0b3JfcHJvYmUyKHVzKTsKCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBpc2QyMDBfZHJpdmVyID0gewoJLm5hbWUgPQkJInVtcy1pc2QyMDAiLAoJLnByb2JlID0JaXNkMjAwX3Byb2JlLAoJLmRpc2Nvbm5lY3QgPQl1c2Jfc3Rvcl9kaXNjb25uZWN0LAoJLnN1c3BlbmQgPQl1c2Jfc3Rvcl9zdXNwZW5kLAoJLnJlc3VtZSA9CXVzYl9zdG9yX3Jlc3VtZSwKCS5yZXNldF9yZXN1bWUgPQl1c2Jfc3Rvcl9yZXNldF9yZXN1bWUsCgkucHJlX3Jlc2V0ID0JdXNiX3N0b3JfcHJlX3Jlc2V0LAoJLnBvc3RfcmVzZXQgPQl1c2Jfc3Rvcl9wb3N0X3Jlc2V0LAoJLmlkX3RhYmxlID0JaXNkMjAwX3VzYl9pZHMsCgkuc29mdF91bmJpbmQgPQkxLAp9OwoKc3RhdGljIGludCBfX2luaXQgaXNkMjAwX2luaXQodm9pZCkKewoJcmV0dXJuIHVzYl9yZWdpc3RlcigmaXNkMjAwX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpc2QyMDBfZXhpdCh2b2lkKQp7Cgl1c2JfZGVyZWdpc3RlcigmaXNkMjAwX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KGlzZDIwMF9pbml0KTsKbW9kdWxlX2V4aXQoaXNkMjAwX2V4aXQpOwo=