LyogVHJhbnNwb3J0ICYgUHJvdG9jb2wgRHJpdmVyIGZvciBJbi1TeXN0ZW0gRGVzaWduLCBJbmMuIElTRDIwMCBBU0lDCiAqCiAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlOgogKiAgIChDKSAyMDAxLTIwMDIgQmrDtnJuIFN0ZW5iZXJnIChiam9ybkBoYXh4LnNlKQogKgogKiBEZXZlbG9wZWQgd2l0aCB0aGUgYXNzaXN0YW5jZSBvZjoKICogICAoQykgMjAwMiBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLm9yZz4KICoKICogSW5pdGlhbCB3b3JrOgogKiAgIChDKSAyMDAwIEluLVN5c3RlbSBEZXNpZ24sIEluYy4gKHN1cHBvcnRAaW4tc3lzdGVtLmNvbSkKICoKICogVGhlIElTRDIwMCBBU0lDIGRvZXMgbm90IG5hdGl2ZWx5IHN1cHBvcnQgQVRBIGRldmljZXMuICBUaGUgY2hpcAogKiBkb2VzIGltcGxlbWVudCBhbiBpbnRlcmZhY2UsIHRoZSBBVEEgQ29tbWFuZCBCbG9jayAoQVRBQ0IpIHdoaWNoIHByb3ZpZGVzCiAqIGEgbWVhbnMgb2YgcGFzc2luZyBBVEEgY29tbWFuZHMgYW5kIEFUQSByZWdpc3RlciBhY2Nlc3NlcyB0byBhIGRldmljZS4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqIEhpc3Rvcnk6CiAqCiAqICAyMDAyLTEwLTE5OiBSZW1vdmVkIHRoZSBzcGVjaWFsaXplZCB0cmFuc2ZlciByb3V0aW5lcy4KICoJCShBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PikKICogIDIwMDEtMDItMjQ6IFJlbW92ZWQgbG90cyBvZiBkdXBsaWNhdGUgY29kZSBhbmQgc2ltcGxpZmllZCB0aGUgc3RydWN0dXJlLgogKgkgICAgICAoYmpvcm5AaGF4eC5zZSkKICogIDIwMDItMDEtMTY6IEZpeGVkIGVuZGlhbm5lc3MgYnVnIHNvIGl0IHdvcmtzIG9uIHRoZSBwcGMgYXJjaC4KICoJICAgICAgKEx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4pCiAqICAyMDAyLTAxLTE3OiBBbGwgYml0ZmllbGRzIHJlbW92ZWQuCiAqCSAgICAgIChiam9ybkBoYXh4LnNlKQogKi8KCgovKiBJbmNsdWRlIGZpbGVzICovCgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvYXRhLmg+CiNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgojaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KCiNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CgojaW5jbHVkZSAidXNiLmgiCiNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKI2luY2x1ZGUgInByb3RvY29sLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKCk1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBJbi1TeXN0ZW0gRGVzaWduLCBJbmMuIElTRDIwMCBBU0lDIik7Ck1PRFVMRV9BVVRIT1IoIkJq9nJuIFN0ZW5iZXJnIDxiam9ybkBoYXh4LnNlPiIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpzdGF0aWMgaW50IGlzZDIwMF9Jbml0aWFsaXphdGlvbihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwoKCi8qCiAqIFRoZSB0YWJsZSBvZiBkZXZpY2VzCiAqLwojZGVmaW5lIFVOVVNVQUxfREVWKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKCQkgICAgdmVuZG9yTmFtZSwgcHJvZHVjdE5hbWUsIHVzZVByb3RvY29sLCB1c2VUcmFuc3BvcnQsIFwKCQkgICAgaW5pdEZ1bmN0aW9uLCBmbGFncykgXAp7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgpLCBcCiAgLmRyaXZlcl9pbmZvID0gKGZsYWdzKXwoVVNCX1VTX1RZUEVfU1RPUjw8MjQpIH0KCnN0cnVjdCB1c2JfZGV2aWNlX2lkIGlzZDIwMF91c2JfaWRzW10gPSB7CiMJaW5jbHVkZSAidW51c3VhbF9pc2QyMDAuaCIKCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlzZDIwMF91c2JfaWRzKTsKCiN1bmRlZiBVTlVTVUFMX0RFVgojdW5kZWYgVVNVQUxfREVWCgovKgogKiBUaGUgZmxhZ3MgdGFibGUKICovCiNkZWZpbmUgVU5VU1VBTF9ERVYoaWRWZW5kb3IsIGlkUHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKCQkgICAgdmVuZG9yX25hbWUsIHByb2R1Y3RfbmFtZSwgdXNlX3Byb3RvY29sLCB1c2VfdHJhbnNwb3J0LCBcCgkJICAgIGluaXRfZnVuY3Rpb24sIEZsYWdzKSBcCnsgXAoJLnZlbmRvck5hbWUgPSB2ZW5kb3JfbmFtZSwJXAoJLnByb2R1Y3ROYW1lID0gcHJvZHVjdF9uYW1lLAlcCgkudXNlUHJvdG9jb2wgPSB1c2VfcHJvdG9jb2wsCVwKCS51c2VUcmFuc3BvcnQgPSB1c2VfdHJhbnNwb3J0LAlcCgkuaW5pdEZ1bmN0aW9uID0gaW5pdF9mdW5jdGlvbiwJXAp9CgpzdGF0aWMgc3RydWN0IHVzX3VudXN1YWxfZGV2IGlzZDIwMF91bnVzdWFsX2Rldl9saXN0W10gPSB7CiMJaW5jbHVkZSAidW51c3VhbF9pc2QyMDAuaCIKCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKCiN1bmRlZiBVTlVTVUFMX0RFVgojdW5kZWYgVVNVQUxfREVWCgoKLyogVGltZW91dCBkZWZpbmVzIChpbiBTZWNvbmRzKSAqLwoKI2RlZmluZSBJU0QyMDBfRU5VTV9CU1lfVElNRU9VVAkJMzUKI2RlZmluZSBJU0QyMDBfRU5VTV9ERVRFQ1RfVElNRU9VVCAgICAgIDMwCiNkZWZpbmUgSVNEMjAwX0RFRkFVTFRfVElNRU9VVAkJMzAKCi8qIGRldmljZSBmbGFncyAqLwojZGVmaW5lIERGX0FUQV9ERVZJQ0UJCTB4MDAwMQojZGVmaW5lIERGX01FRElBX1NUQVRVU19FTkFCTEVECTB4MDAwMgojZGVmaW5lIERGX1JFTU9WQUJMRV9NRURJQQkweDAwMDQKCi8qIGNhcGFiaWxpdHkgYml0IGRlZmluaXRpb25zICovCiNkZWZpbmUgQ0FQQUJJTElUWV9ETUEJCTB4MDEKI2RlZmluZSBDQVBBQklMSVRZX0xCQQkJMHgwMgoKLyogY29tbWFuZF9zZXRYIGJpdCBkZWZpbml0aW9ucyAqLwojZGVmaW5lIENPTU1BTkRTRVRfUkVNT1ZBQkxFCTB4MDIKI2RlZmluZSBDT01NQU5EU0VUX01FRElBX1NUQVRVUyAweDEwCgovKiBBVEEgVmVuZG9yIFNwZWNpZmljIGRlZmluZXMgKi8KI2RlZmluZSBBVEFfQUREUkVTU19ERVZIRUFEX1NURCAgICAgIDB4YTAKI2RlZmluZSBBVEFfQUREUkVTU19ERVZIRUFEX0xCQV9NT0RFIDB4NDAgICAgCiNkZWZpbmUgQVRBX0FERFJFU1NfREVWSEVBRF9TTEFWRSAgICAweDEwCgovKiBBY3Rpb24gU2VsZWN0IGJpdHMgKi8KI2RlZmluZSBBQ1RJT05fU0VMRUNUXzAJICAgICAweDAxCiNkZWZpbmUgQUNUSU9OX1NFTEVDVF8xCSAgICAgMHgwMgojZGVmaW5lIEFDVElPTl9TRUxFQ1RfMgkgICAgIDB4MDQKI2RlZmluZSBBQ1RJT05fU0VMRUNUXzMJICAgICAweDA4CiNkZWZpbmUgQUNUSU9OX1NFTEVDVF80CSAgICAgMHgxMAojZGVmaW5lIEFDVElPTl9TRUxFQ1RfNQkgICAgIDB4MjAKI2RlZmluZSBBQ1RJT05fU0VMRUNUXzYJICAgICAweDQwCiNkZWZpbmUgQUNUSU9OX1NFTEVDVF83CSAgICAgMHg4MAoKLyogUmVnaXN0ZXIgU2VsZWN0IGJpdHMgKi8KI2RlZmluZSBSRUdfQUxURVJOQVRFX1NUQVRVUwkweDAxCiNkZWZpbmUgUkVHX0RFVklDRV9DT05UUk9MCTB4MDEKI2RlZmluZSBSRUdfRVJST1IJCTB4MDIKI2RlZmluZSBSRUdfRkVBVFVSRVMJCTB4MDIKI2RlZmluZSBSRUdfU0VDVE9SX0NPVU5UCTB4MDQKI2RlZmluZSBSRUdfU0VDVE9SX05VTUJFUgkweDA4CiNkZWZpbmUgUkVHX0NZTElOREVSX0xPVwkweDEwCiNkZWZpbmUgUkVHX0NZTElOREVSX0hJR0gJMHgyMAojZGVmaW5lIFJFR19ERVZJQ0VfSEVBRAkJMHg0MAojZGVmaW5lIFJFR19TVEFUVVMJCTB4ODAKI2RlZmluZSBSRUdfQ09NTUFORAkJMHg4MAoKLyogQVRBIHJlZ2lzdGVycyBvZmZzZXQgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBBVEFfUkVHX0VSUk9SX09GRlNFVAkJMQojZGVmaW5lIEFUQV9SRUdfTENZTF9PRkZTRVQJCTQKI2RlZmluZSBBVEFfUkVHX0hDWUxfT0ZGU0VUCQk1CiNkZWZpbmUgQVRBX1JFR19TVEFUVVNfT0ZGU0VUCQk3CgovKiBBVEEgZXJyb3IgZGVmaW5pdGlvbnMgbm90IGluIDxsaW51eC9oZHJlZy5oPiAqLwojZGVmaW5lIEFUQV9FUlJPUl9NRURJQV9DSEFOR0UJCTB4MjAKCi8qIEFUQSBjb21tYW5kIGRlZmluaXRpb25zIG5vdCBpbiA8bGludXgvaGRyZWcuaD4gKi8KI2RlZmluZSBBVEFfQ09NTUFORF9HRVRfTUVESUFfU1RBVFVTCTB4REEKI2RlZmluZSBBVEFfQ09NTUFORF9NRURJQV9FSkVDVAkJMHhFRAoKLyogQVRBIGRyaXZlIGNvbnRyb2wgZGVmaW5pdGlvbnMgKi8KI2RlZmluZSBBVEFfRENfRElTQUJMRV9JTlRFUlJVUFRTCTB4MDIKI2RlZmluZSBBVEFfRENfUkVTRVRfQ09OVFJPTExFUgkJMHgwNAojZGVmaW5lIEFUQV9EQ19SRUVOQUJMRV9DT05UUk9MTEVSCTB4MDAKCi8qCiAqICBHZW5lcmFsIHB1cnBvc2UgcmV0dXJuIGNvZGVzCiAqLyAKCiNkZWZpbmUgSVNEMjAwX0VSUk9SCQktMQojZGVmaW5lIElTRDIwMF9HT09ECQkgMAoKLyoKICogVHJhbnNwb3J0IHJldHVybiBjb2RlcwogKi8KCiNkZWZpbmUgSVNEMjAwX1RSQU5TUE9SVF9HT09EICAgICAgIDAgICAvKiBUcmFuc3BvcnQgZ29vZCwgY29tbWFuZCBnb29kICAgICAqLwojZGVmaW5lIElTRDIwMF9UUkFOU1BPUlRfRkFJTEVEICAgICAxICAgLyogVHJhbnNwb3J0IGdvb2QsIGNvbW1hbmQgZmFpbGVkICAgKi8KI2RlZmluZSBJU0QyMDBfVFJBTlNQT1JUX0VSUk9SICAgICAgMiAgIC8qIFRyYW5zcG9ydCBiYWQgKGkuZS4gZGV2aWNlIGRlYWQpICovCgovKiBkcml2ZXIgYWN0aW9uIGNvZGVzICovCiNkZWZpbmUJQUNUSU9OX1JFQURfU1RBVFVTCTAKI2RlZmluZQlBQ1RJT05fUkVTRVQJCTEKI2RlZmluZQlBQ1RJT05fUkVFTkFCTEUJCTIKI2RlZmluZQlBQ1RJT05fU09GVF9SRVNFVAkzCiNkZWZpbmUJQUNUSU9OX0VOVU0JCTQKI2RlZmluZQlBQ1RJT05fSURFTlRJRlkJCTUKCgovKgogKiBhdGFfY2RiIHN0cnVjdAogKi8KCgp1bmlvbiBhdGFfY2RiIHsKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTNGNjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGMzsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNDsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNTsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNjsKCQl1bnNpZ25lZCBjaGFyIFdyaXRlRGF0YTFGNzsKCQl1bnNpZ25lZCBjaGFyIFJlc2VydmVkWzNdOwoJfSBnZW5lcmljOwoKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIEFsdGVybmF0ZVN0YXR1c0J5dGU7CgkJdW5zaWduZWQgY2hhciBFcnJvckJ5dGU7CgkJdW5zaWduZWQgY2hhciBTZWN0b3JDb3VudEJ5dGU7CgkJdW5zaWduZWQgY2hhciBTZWN0b3JOdW1iZXJCeXRlOwoJCXVuc2lnbmVkIGNoYXIgQ3lsaW5kZXJMb3dCeXRlOwoJCXVuc2lnbmVkIGNoYXIgQ3lsaW5kZXJIaWdoQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIERldmljZUhlYWRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU3RhdHVzQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIFJlc2VydmVkWzNdOwoJfSByZWFkOwoKCXN0cnVjdCB7CgkJdW5zaWduZWQgY2hhciBTaWduYXR1cmVCeXRlMDsKCQl1bnNpZ25lZCBjaGFyIFNpZ25hdHVyZUJ5dGUxOwoJCXVuc2lnbmVkIGNoYXIgQWN0aW9uU2VsZWN0OwoJCXVuc2lnbmVkIGNoYXIgUmVnaXN0ZXJTZWxlY3Q7CgkJdW5zaWduZWQgY2hhciBUcmFuc2ZlckJsb2NrU2l6ZTsKCQl1bnNpZ25lZCBjaGFyIERldmljZUNvbnRyb2xCeXRlOwoJCXVuc2lnbmVkIGNoYXIgRmVhdHVyZXNCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU2VjdG9yQ291bnRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgU2VjdG9yTnVtYmVyQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIEN5bGluZGVyTG93Qnl0ZTsKCQl1bnNpZ25lZCBjaGFyIEN5bGluZGVySGlnaEJ5dGU7CgkJdW5zaWduZWQgY2hhciBEZXZpY2VIZWFkQnl0ZTsKCQl1bnNpZ25lZCBjaGFyIENvbW1hbmRCeXRlOwoJCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbM107Cgl9IHdyaXRlOwp9OwoKCi8qCiAqIElucXVpcnkgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgaXMgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgdGFyZ2V0CiAqIGFmdGVyIGl0IHJlY2VpdmVzIGFuIGlucXVpcnkuCiAqCiAqIFRoaXMgc3RydWN0dXJlIG1heSBiZSBleHRlbmRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZAogKiBpbiB0aGUgZmllbGQgQWRkaXRpb25hbExlbmd0aC4gVGhlIGRlZmluZWQgc2l6ZSBjb25zdGFudCBvbmx5CiAqIGluY2x1ZGVzIGZpZWxkcyB0aHJvdWdoIFByb2R1Y3RSZXZpc2lvbkxldmVsLgogKi8KCi8qCiAqIERldmljZVR5cGUgZmllbGQKICovCiNkZWZpbmUgRElSRUNUX0FDQ0VTU19ERVZJQ0UJICAgIDB4MDAgICAgLyogZGlza3MgKi8KI2RlZmluZSBERVZJQ0VfUkVNT1ZBQkxFCQkweDgwCgpzdHJ1Y3QgaW5xdWlyeV9kYXRhIHsKICAgCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZTsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZU1vZGlmaWVyOwoJdW5zaWduZWQgY2hhciBWZXJzaW9uczsKCXVuc2lnbmVkIGNoYXIgRm9ybWF0OyAKCXVuc2lnbmVkIGNoYXIgQWRkaXRpb25hbExlbmd0aDsKCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbMl07Cgl1bnNpZ25lZCBjaGFyIENhcGFiaWxpdHk7Cgl1bnNpZ25lZCBjaGFyIFZlbmRvcklkWzhdOwoJdW5zaWduZWQgY2hhciBQcm9kdWN0SWRbMTZdOwoJdW5zaWduZWQgY2hhciBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKCXVuc2lnbmVkIGNoYXIgVmVuZG9yU3BlY2lmaWNbMjBdOwoJdW5zaWduZWQgY2hhciBSZXNlcnZlZDNbNDBdOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKCi8qCiAqIElOUVVJUlkgZGF0YSBidWZmZXIgc2l6ZQogKi8KCiNkZWZpbmUgSU5RVUlSWURBVEFCVUZGRVJTSVpFIDM2CgoKLyoKICogSVNEMjAwIENPTkZJRyBkYXRhIHN0cnVjdAogKi8KCiNkZWZpbmUgQVRBQ0ZHX1RJTUlORwkgIDB4MGYKI2RlZmluZSBBVEFDRkdfQVRBUElfUkVTRVQgICAgIDB4MTAKI2RlZmluZSBBVEFDRkdfTUFTVEVSCSAgMHgyMAojZGVmaW5lIEFUQUNGR19CTE9DS1NJWkUgICAgICAgMHhhMAoKI2RlZmluZSBBVEFDRkdFX0xBU1RfTFVOICAgICAgIDB4MDcKI2RlZmluZSBBVEFDRkdFX0RFU0NfT1ZFUlJJREUgIDB4MDgKI2RlZmluZSBBVEFDRkdFX1NUQVRFX1NVU1BFTkQgIDB4MTAKI2RlZmluZSBBVEFDRkdFX1NLSVBfQk9PVCAgICAgIDB4MjAKI2RlZmluZSBBVEFDRkdFX0NPTkZfREVTQzIgICAgIDB4NDAKI2RlZmluZSBBVEFDRkdFX0lOSVRfU1RBVFVTICAgIDB4ODAKCiNkZWZpbmUgQ0ZHX0NBUEFCSUxJVFlfU1JTVCAgICAweDAxCgpzdHJ1Y3QgaXNkMjAwX2NvbmZpZyB7Cgl1bnNpZ25lZCBjaGFyIEV2ZW50Tm90aWZpY2F0aW9uOwoJdW5zaWduZWQgY2hhciBFeHRlcm5hbENsb2NrOwoJdW5zaWduZWQgY2hhciBBVEFJbml0VGltZW91dDsKCXVuc2lnbmVkIGNoYXIgQVRBQ29uZmlnOwoJdW5zaWduZWQgY2hhciBBVEFNYWpvckNvbW1hbmQ7Cgl1bnNpZ25lZCBjaGFyIEFUQU1pbm9yQ29tbWFuZDsKCXVuc2lnbmVkIGNoYXIgQVRBRXh0cmFDb25maWc7Cgl1bnNpZ25lZCBjaGFyIENhcGFiaWxpdHk7Cn1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CgoKLyoKICogSVNEMjAwIGRyaXZlciBpbmZvcm1hdGlvbiBzdHJ1Y3QKICovCgpzdHJ1Y3QgaXNkMjAwX2luZm8gewoJc3RydWN0IGlucXVpcnlfZGF0YSBJbnF1aXJ5RGF0YTsKCXUxNiAqaWQ7CglzdHJ1Y3QgaXNkMjAwX2NvbmZpZyBDb25maWdEYXRhOwoJdW5zaWduZWQgY2hhciAqUmVnc0J1ZjsKCXVuc2lnbmVkIGNoYXIgQVRBUmVnc1s4XTsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlSGVhZDsKCXVuc2lnbmVkIGNoYXIgRGV2aWNlRmxhZ3M7CgoJLyogbWF4aW11bSBudW1iZXIgb2YgTFVOcyBzdXBwb3J0ZWQgKi8KCXVuc2lnbmVkIGNoYXIgTWF4TFVOczsKCXVuc2lnbmVkIGNoYXIgY21uZFtCTEtfTUFYX0NEQl07CglzdHJ1Y3Qgc2NzaV9jbW5kIHNyYjsKCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKfTsKCgovKgogKiBSZWFkIENhcGFjaXR5IERhdGEgLSByZXR1cm5lZCBpbiBCaWcgRW5kaWFuIGZvcm1hdAogKi8KCnN0cnVjdCByZWFkX2NhcGFjaXR5X2RhdGEgewoJX19iZTMyIExvZ2ljYWxCbG9ja0FkZHJlc3M7CglfX2JlMzIgQnl0ZXNQZXJCbG9jazsKfTsKCi8qCiAqIFJlYWQgQmxvY2sgTGltaXRzIERhdGEgLSByZXR1cm5lZCBpbiBCaWcgRW5kaWFuIGZvcm1hdAogKiBUaGlzIHN0cnVjdHVyZSByZXR1cm5zIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIGJsb2NrCiAqIHNpemUgZm9yIGEgVEFQRSBkZXZpY2UuCiAqLwoKc3RydWN0IHJlYWRfYmxvY2tfbGltaXRzIHsKCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ7Cgl1bnNpZ25lZCBjaGFyIEJsb2NrTWF4aW11bVNpemVbM107Cgl1bnNpZ25lZCBjaGFyIEJsb2NrTWluaW11bVNpemVbMl07Cn07CgoKLyoKICogU2Vuc2UgRGF0YSBGb3JtYXQKICovCgojZGVmaW5lIFNFTlNFX0VSUkNPREUJICAgMHg3ZgojZGVmaW5lIFNFTlNFX0VSUkNPREVfVkFMSUQgICAgIDB4ODAKI2RlZmluZSBTRU5TRV9GTEFHX1NFTlNFX0tFWSAgICAweDBmCiNkZWZpbmUgU0VOU0VfRkxBR19CQURfTEVOR1RIICAgMHgyMAojZGVmaW5lIFNFTlNFX0ZMQUdfRU5EX09GX01FRElBIDB4NDAKI2RlZmluZSBTRU5TRV9GTEFHX0ZJTEVfTUFSSyAgICAweDgwCnN0cnVjdCBzZW5zZV9kYXRhIHsKCXVuc2lnbmVkIGNoYXIgRXJyb3JDb2RlOwoJdW5zaWduZWQgY2hhciBTZWdtZW50TnVtYmVyOwoJdW5zaWduZWQgY2hhciBGbGFnczsKCXVuc2lnbmVkIGNoYXIgSW5mb3JtYXRpb25bNF07Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUxlbmd0aDsKCXVuc2lnbmVkIGNoYXIgQ29tbWFuZFNwZWNpZmljSW5mb3JtYXRpb25bNF07Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUNvZGU7Cgl1bnNpZ25lZCBjaGFyIEFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXI7Cgl1bnNpZ25lZCBjaGFyIEZpZWxkUmVwbGFjZWFibGVVbml0Q29kZTsKCXVuc2lnbmVkIGNoYXIgU2Vuc2VLZXlTcGVjaWZpY1szXTsKfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CgovKgogKiBEZWZhdWx0IHJlcXVlc3Qgc2Vuc2UgYnVmZmVyIHNpemUKICovCgojZGVmaW5lIFNFTlNFX0JVRkZFUl9TSVpFIDE4CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSGVscGVyIHJvdXRpbmVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfYnVpbGRfc2Vuc2UKICoJCQkJCQkJCQkgCiAqICBCdWlsZHMgYW4gYXJ0aWZpY2lhbCBzZW5zZSBidWZmZXIgdG8gcmVwb3J0IHRoZSByZXN1bHRzIG9mIGEgCiAqICBmYWlsZWQgY29tbWFuZC4KICoJCQkJCQkJCSAgICAgICAKICogUkVUVVJOUzoKICogICAgdm9pZAogKi8Kc3RhdGljIHZvaWQgaXNkMjAwX2J1aWxkX3NlbnNlKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJc3RydWN0IHNlbnNlX2RhdGEgKmJ1ZiA9IChzdHJ1Y3Qgc2Vuc2VfZGF0YSAqKSAmc3JiLT5zZW5zZV9idWZmZXJbMF07Cgl1bnNpZ25lZCBjaGFyIGVycm9yID0gaW5mby0+QVRBUmVnc1tBVEFfUkVHX0VSUk9SX09GRlNFVF07CgoJaWYoZXJyb3IgJiBBVEFfRVJST1JfTUVESUFfQ0hBTkdFKSB7CgkJYnVmLT5FcnJvckNvZGUgPSAweDcwIHwgU0VOU0VfRVJSQ09ERV9WQUxJRDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDB4YjsKCQlidWYtPkZsYWdzID0gVU5JVF9BVFRFTlRJT047CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIgPSAwOwoJfSBlbHNlIGlmIChlcnJvciAmIEFUQV9NQ1IpIHsKCQlidWYtPkVycm9yQ29kZSA9IDB4NzAgfCBTRU5TRV9FUlJDT0RFX1ZBTElEOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlTGVuZ3RoID0gMHhiOwoJCWJ1Zi0+RmxhZ3MgPSAgVU5JVF9BVFRFTlRJT047CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGVRdWFsaWZpZXIgPSAwOwoJfSBlbHNlIGlmIChlcnJvciAmIEFUQV9UUkswTkYpIHsKCQlidWYtPkVycm9yQ29kZSA9IDB4NzAgfCBTRU5TRV9FUlJDT0RFX1ZBTElEOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlTGVuZ3RoID0gMHhiOwoJCWJ1Zi0+RmxhZ3MgPSAgTk9UX1JFQURZOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZSA9IDA7CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyID0gMDsKCX0gZWxzZSBpZiAoZXJyb3IgJiBBVEFfVU5DKSB7CgkJYnVmLT5FcnJvckNvZGUgPSAweDcwIHwgU0VOU0VfRVJSQ09ERV9WQUxJRDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDB4YjsKCQlidWYtPkZsYWdzID0gIERBVEFfUFJPVEVDVDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUNvZGUgPSAwOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllciA9IDA7Cgl9IGVsc2UgewoJCWJ1Zi0+RXJyb3JDb2RlID0gMDsKCQlidWYtPkFkZGl0aW9uYWxTZW5zZUxlbmd0aCA9IDA7CgkJYnVmLT5GbGFncyA9ICAwOwoJCWJ1Zi0+QWRkaXRpb25hbFNlbnNlQ29kZSA9IDA7CgkJYnVmLT5BZGRpdGlvbmFsU2Vuc2VDb2RlUXVhbGlmaWVyID0gMDsKCX0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUcmFuc3BvcnQgcm91dGluZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBpc2QyMDBfc2V0X3NyYigpLCBpc2QyMDBfc3JiX3NldF9idWZmbGVuKCkKICoKICogVHdvIGhlbHBlcnMgdG8gZmFjaWxpdGF0ZSBpbiBpbml0aWFsaXphdGlvbiBvZiBzY3NpX2NtbmQgc3RydWN0dXJlCiAqIFdpbGwgbmVlZCB0byBjaGFuZ2Ugd2hlbiBzdHJ1Y3Qgc2NzaV9jbW5kIGNoYW5nZXMKICovCnN0YXRpYyB2b2lkIGlzZDIwMF9zZXRfc3JiKHN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbywKCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdm9pZCogYnVmZiwgdW5zaWduZWQgYnVmZmxlbikKewoJc3RydWN0IHNjc2lfY21uZCAqc3JiID0gJmluZm8tPnNyYjsKCglpZiAoYnVmZikKCQlzZ19pbml0X29uZSgmaW5mby0+c2csIGJ1ZmYsIGJ1ZmZsZW4pOwoKCXNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPSBkaXI7CglzcmItPnNkYi50YWJsZS5zZ2wgPSBidWZmID8gJmluZm8tPnNnIDogTlVMTDsKCXNyYi0+c2RiLmxlbmd0aCA9IGJ1ZmZsZW47CglzcmItPnNkYi50YWJsZS5uZW50cyA9IGJ1ZmYgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQgaXNkMjAwX3NyYl9zZXRfYnVmZmxlbihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHVuc2lnbmVkIGJ1ZmZsZW4pCnsKCXNyYi0+c2RiLmxlbmd0aCA9IGJ1ZmZsZW47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGlzZDIwMF9hY3Rpb24KICoKICogUm91dGluZSBmb3Igc2VuZGluZyBjb21tYW5kcyB0byB0aGUgaXNkMjAwCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfYWN0aW9uKCBzdHJ1Y3QgdXNfZGF0YSAqdXMsIGludCBhY3Rpb24sIAoJCQkgIHZvaWQqIHBvaW50ZXIsIGludCB2YWx1ZSApCnsKCXVuaW9uIGF0YV9jZGIgYXRhOwoJc3RydWN0IHNjc2lfZGV2aWNlIHNyYl9kZXY7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJc3RydWN0IHNjc2lfY21uZCAqc3JiID0gJmluZm8tPnNyYjsKCWludCBzdGF0dXM7CgoJbWVtc2V0KCZhdGEsIDAsIHNpemVvZihhdGEpKTsKCW1lbXNldCgmc3JiX2RldiwgMCwgc2l6ZW9mKHNyYl9kZXYpKTsKCXNyYi0+Y21uZCA9IGluZm8tPmNtbmQ7CglzcmItPmRldmljZSA9ICZzcmJfZGV2OwoJKytzcmItPnNlcmlhbF9udW1iZXI7CgoJYXRhLmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCWF0YS5nZW5lcmljLlNpZ25hdHVyZUJ5dGUxID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNaW5vckNvbW1hbmQ7CglhdGEuZ2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDE7CgoJc3dpdGNoICggYWN0aW9uICkgewoJY2FzZSBBQ1RJT05fUkVBRF9TVEFUVVM6CgkJVVNfREVCVUdQKCIgICBpc2QyMDBfYWN0aW9uKFJFQURfU1RBVFVTKVxuIik7CgkJYXRhLmdlbmVyaWMuQWN0aW9uU2VsZWN0ID0gQUNUSU9OX1NFTEVDVF8wfEFDVElPTl9TRUxFQ1RfMjsKCQlhdGEuZ2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9CgkJICBSRUdfQ1lMSU5ERVJfTE9XIHwgUkVHX0NZTElOREVSX0hJR0ggfAoJCSAgUkVHX1NUQVRVUyB8IFJFR19FUlJPUjsKCQlpc2QyMDBfc2V0X3NyYihpbmZvLCBETUFfRlJPTV9ERVZJQ0UsIHBvaW50ZXIsIHZhbHVlKTsKCQlicmVhazsKCgljYXNlIEFDVElPTl9FTlVNOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihFTlVNLDB4JTAyeClcbiIsdmFsdWUpOwoJCWF0YS5nZW5lcmljLkFjdGlvblNlbGVjdCA9IEFDVElPTl9TRUxFQ1RfMXxBQ1RJT05fU0VMRUNUXzJ8CgkJCQkJICAgQUNUSU9OX1NFTEVDVF8zfEFDVElPTl9TRUxFQ1RfNHwKCQkJCQkgICBBQ1RJT05fU0VMRUNUXzU7CgkJYXRhLmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfREVWSUNFX0hFQUQ7CgkJYXRhLndyaXRlLkRldmljZUhlYWRCeXRlID0gdmFsdWU7CgkJaXNkMjAwX3NldF9zcmIoaW5mbywgRE1BX05PTkUsIE5VTEwsIDApOwoJCWJyZWFrOwoKCWNhc2UgQUNUSU9OX1JFU0VUOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihSRVNFVClcbiIpOwoJCWF0YS5nZW5lcmljLkFjdGlvblNlbGVjdCA9IEFDVElPTl9TRUxFQ1RfMXxBQ1RJT05fU0VMRUNUXzJ8CgkJCQkJICAgQUNUSU9OX1NFTEVDVF8zfEFDVElPTl9TRUxFQ1RfNDsKCQlhdGEuZ2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19ERVZJQ0VfQ09OVFJPTDsKCQlhdGEud3JpdGUuRGV2aWNlQ29udHJvbEJ5dGUgPSBBVEFfRENfUkVTRVRfQ09OVFJPTExFUjsKCQlpc2QyMDBfc2V0X3NyYihpbmZvLCBETUFfTk9ORSwgTlVMTCwgMCk7CgkJYnJlYWs7CgoJY2FzZSBBQ1RJT05fUkVFTkFCTEU6CgkJVVNfREVCVUdQKCIgICBpc2QyMDBfYWN0aW9uKFJFRU5BQkxFKVxuIik7CgkJYXRhLmdlbmVyaWMuQWN0aW9uU2VsZWN0ID0gQUNUSU9OX1NFTEVDVF8xfEFDVElPTl9TRUxFQ1RfMnwKCQkJCQkgICBBQ1RJT05fU0VMRUNUXzN8QUNUSU9OX1NFTEVDVF80OwoJCWF0YS5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0RFVklDRV9DT05UUk9MOwoJCWF0YS53cml0ZS5EZXZpY2VDb250cm9sQnl0ZSA9IEFUQV9EQ19SRUVOQUJMRV9DT05UUk9MTEVSOwoJCWlzZDIwMF9zZXRfc3JiKGluZm8sIERNQV9OT05FLCBOVUxMLCAwKTsKCQlicmVhazsKCgljYXNlIEFDVElPTl9TT0ZUX1JFU0VUOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihTT0ZUX1JFU0VUKVxuIik7CgkJYXRhLmdlbmVyaWMuQWN0aW9uU2VsZWN0ID0gQUNUSU9OX1NFTEVDVF8xfEFDVElPTl9TRUxFQ1RfNTsKCQlhdGEuZ2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19ERVZJQ0VfSEVBRCB8IFJFR19DT01NQU5EOwoJCWF0YS53cml0ZS5EZXZpY2VIZWFkQnl0ZSA9IGluZm8tPkRldmljZUhlYWQ7CgkJYXRhLndyaXRlLkNvbW1hbmRCeXRlID0gQVRBX0NNRF9ERVZfUkVTRVQ7CgkJaXNkMjAwX3NldF9zcmIoaW5mbywgRE1BX05PTkUsIE5VTEwsIDApOwoJCWJyZWFrOwoKCWNhc2UgQUNUSU9OX0lERU5USUZZOgoJCVVTX0RFQlVHUCgiICAgaXNkMjAwX2FjdGlvbihJREVOVElGWSlcbiIpOwoJCWF0YS5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0NPTU1BTkQ7CgkJYXRhLndyaXRlLkNvbW1hbmRCeXRlID0gQVRBX0NNRF9JRF9BVEE7CgkJaXNkMjAwX3NldF9zcmIoaW5mbywgRE1BX0ZST01fREVWSUNFLCBpbmZvLT5pZCwKCQkJCUFUQV9JRF9XT1JEUyAqIDIpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJVVNfREVCVUdQKCJFcnJvcjogVW5kZWZpbmVkIGFjdGlvbiAlZFxuIixhY3Rpb24pOwoJCXJldHVybiBJU0QyMDBfRVJST1I7Cgl9CgoJbWVtY3B5KHNyYi0+Y21uZCwgJmF0YSwgc2l6ZW9mKGF0YS5nZW5lcmljKSk7CglzcmItPmNtZF9sZW4gPSBzaXplb2YoYXRhLmdlbmVyaWMpOwoJc3RhdHVzID0gdXNiX3N0b3JfQnVsa190cmFuc3BvcnQoc3JiLCB1cyk7CglpZiAoc3RhdHVzID09IFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EKQoJCXN0YXR1cyA9IElTRDIwMF9HT09EOwoJZWxzZSB7CgkJVVNfREVCVUdQKCIgICBpc2QyMDBfYWN0aW9uKDB4JTAyeCkgZXJyb3I6ICVkXG4iLGFjdGlvbixzdGF0dXMpOwoJCXN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCQkvKiBuZWVkIHRvIHJlc2V0IGRldmljZSBoZXJlICovCgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9yZWFkX3JlZ3MKICoJCQkJCQkJCQkgCiAqIFJlYWQgQVRBIFJlZ2lzdGVycwogKgogKiBSRVRVUk5TOgogKiAgICBJU0Qgc3RhdHVzIGNvZGUKICovCnN0YXRpYyBpbnQgaXNkMjAwX3JlYWRfcmVncyggc3RydWN0IHVzX2RhdGEgKnVzICkKewoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvID0gKHN0cnVjdCBpc2QyMDBfaW5mbyAqKXVzLT5leHRyYTsKCWludCByZXRTdGF0dXMgPSBJU0QyMDBfR09PRDsKCWludCB0cmFuc2ZlclN0YXR1czsKCglVU19ERUJVR1AoIkVudGVyaW5nIGlzZDIwMF9Jc3N1ZUFUQVJlYWRSZWdzXG4iKTsKCgl0cmFuc2ZlclN0YXR1cyA9IGlzZDIwMF9hY3Rpb24oIHVzLCBBQ1RJT05fUkVBRF9TVEFUVVMsCgkJCQkgICAgaW5mby0+UmVnc0J1Ziwgc2l6ZW9mKGluZm8tPkFUQVJlZ3MpICk7CglpZiAodHJhbnNmZXJTdGF0dXMgIT0gSVNEMjAwX1RSQU5TUE9SVF9HT09EKSB7CgkJVVNfREVCVUdQKCIgICBFcnJvciByZWFkaW5nIEFUQSByZWdpc3RlcnNcbiIpOwoJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCX0gZWxzZSB7CgkJbWVtY3B5KGluZm8tPkFUQVJlZ3MsIGluZm8tPlJlZ3NCdWYsIHNpemVvZihpbmZvLT5BVEFSZWdzKSk7CgkJVVNfREVCVUdQKCIgICBHb3QgQVRBIFJlZ2lzdGVyW0FUQV9SRUdfRVJST1JfT0ZGU0VUXSA9IDB4JXhcbiIsCgkJCSAgaW5mby0+QVRBUmVnc1tBVEFfUkVHX0VSUk9SX09GRlNFVF0pOwoJfQoKCXJldHVybiByZXRTdGF0dXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSW52b2tlIHRoZSB0cmFuc3BvcnQgYW5kIGJhc2ljIGVycm9yLWhhbmRsaW5nL3JlY292ZXJ5IG1ldGhvZHMKICoKICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcm90b2NvbCBsYXllcnMgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0bwogKiB0aGUgZGV2aWNlIGFuZCByZWNlaXZlIHRoZSByZXNwb25zZS4KICovCnN0YXRpYyB2b2lkIGlzZDIwMF9pbnZva2VfdHJhbnNwb3J0KCBzdHJ1Y3QgdXNfZGF0YSAqdXMsIAoJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIAoJCQkgICAgICB1bmlvbiBhdGFfY2RiICphdGFDZGIgKQp7CglpbnQgbmVlZF9hdXRvX3NlbnNlID0gMDsKCWludCB0cmFuc2ZlclN0YXR1czsKCWludCByZXN1bHQ7CgoJLyogc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgdHJhbnNwb3J0IGxheWVyICovCgltZW1jcHkoc3JiLT5jbW5kLCBhdGFDZGIsIHNpemVvZihhdGFDZGItPmdlbmVyaWMpKTsKCXNyYi0+Y21kX2xlbiA9IHNpemVvZihhdGFDZGItPmdlbmVyaWMpOwoJdHJhbnNmZXJTdGF0dXMgPSB1c2Jfc3Rvcl9CdWxrX3RyYW5zcG9ydChzcmIsIHVzKTsKCgkvKiBpZiB0aGUgY29tbWFuZCBnZXRzIGFib3J0ZWQgYnkgdGhlIGhpZ2hlciBsYXllcnMsIHdlIG5lZWQgdG8KCSAqIHNob3J0LWNpcmN1aXQgYWxsIG90aGVyIHByb2Nlc3NpbmcKCSAqLwoJaWYgKHRlc3RfYml0KFVTX0ZMSURYX1RJTUVEX09VVCwgJnVzLT5kZmxhZ3MpKSB7CgkJVVNfREVCVUdQKCItLSBjb21tYW5kIHdhcyBhYm9ydGVkXG4iKTsKCQlnb3RvIEhhbmRsZV9BYm9ydDsKCX0KCglzd2l0Y2ggKHRyYW5zZmVyU3RhdHVzKSB7CgoJY2FzZSBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDoKCQkvKiBJbmRpY2F0ZSBhIGdvb2QgcmVzdWx0ICovCgkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwoJCWJyZWFrOwoKCWNhc2UgVVNCX1NUT1JfVFJBTlNQT1JUX05PX1NFTlNFOgoJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyBwcm90b2NvbCBmYWlsdXJlXG4iKTsKCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKCQlyZXR1cm47CgoJY2FzZSBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOgoJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyBjb21tYW5kIGZhaWx1cmVcbiIpOwoJCW5lZWRfYXV0b19zZW5zZSA9IDE7CgkJYnJlYWs7CgoJY2FzZSBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I6CgkJVVNfREVCVUdQKCItLSB0cmFuc3BvcnQgaW5kaWNhdGVzIHRyYW5zcG9ydCBlcnJvclxuIik7CgkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CgkJLyogTmVlZCByZXNldCBoZXJlICovCgkJcmV0dXJuOwogICAgCglkZWZhdWx0OgoJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyB1bmtub3duIGVycm9yXG4iKTsgICAKCQlzcmItPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKCQkvKiBOZWVkIHJlc2V0IGhlcmUgKi8KCQlyZXR1cm47Cgl9CgoJaWYgKChzY3NpX2dldF9yZXNpZChzcmIpID4gMCkgJiYKCSAgICAhKChzcmItPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgfHwKCSAgICAgIChzcmItPmNtbmRbMF0gPT0gSU5RVUlSWSkgfHwKCSAgICAgIChzcmItPmNtbmRbMF0gPT0gTU9ERV9TRU5TRSkgfHwKCSAgICAgIChzcmItPmNtbmRbMF0gPT0gTE9HX1NFTlNFKSB8fAoJICAgICAgKHNyYi0+Y21uZFswXSA9PSBNT0RFX1NFTlNFXzEwKSkpIHsKCQlVU19ERUJVR1AoIi0tIHVuZXhwZWN0ZWRseSBzaG9ydCB0cmFuc2ZlclxuIik7CgkJbmVlZF9hdXRvX3NlbnNlID0gMTsKCX0KCglpZiAobmVlZF9hdXRvX3NlbnNlKSB7CgkJcmVzdWx0ID0gaXNkMjAwX3JlYWRfcmVncyh1cyk7CgkJaWYgKHRlc3RfYml0KFVTX0ZMSURYX1RJTUVEX09VVCwgJnVzLT5kZmxhZ3MpKSB7CgkJCVVTX0RFQlVHUCgiLS0gYXV0by1zZW5zZSBhYm9ydGVkXG4iKTsKCQkJZ290byBIYW5kbGVfQWJvcnQ7CgkJfQoJCWlmIChyZXN1bHQgPT0gSVNEMjAwX0dPT0QpIHsKCQkJaXNkMjAwX2J1aWxkX3NlbnNlKHVzLCBzcmIpOwoJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKCgkJCS8qIElmIHRoaW5ncyBhcmUgcmVhbGx5IG9rYXksIHRoZW4gbGV0J3Mgc2hvdyB0aGF0ICovCgkJCWlmICgoc3JiLT5zZW5zZV9idWZmZXJbMl0gJiAweGYpID09IDB4MCkKCQkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQl9IGVsc2UgewoJCQlzcmItPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKCQkJLyogTmVlZCByZXNldCBoZXJlICovCgkJfQoJfQoKCS8qIFJlZ2FyZGxlc3Mgb2YgYXV0by1zZW5zZSwgaWYgd2UgX2tub3dfIHdlIGhhdmUgYW4gZXJyb3IKCSAqIGNvbmRpdGlvbiwgc2hvdyB0aGF0IGluIHRoZSByZXN1bHQgY29kZQoJICovCglpZiAodHJhbnNmZXJTdGF0dXMgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0ZBSUxFRCkKCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKCXJldHVybjsKCgkvKiBhYm9ydCBwcm9jZXNzaW5nOiB0aGUgYnVsay1vbmx5IHRyYW5zcG9ydCByZXF1aXJlcyBhIHJlc2V0CgkgKiBmb2xsb3dpbmcgYW4gYWJvcnQgKi8KCUhhbmRsZV9BYm9ydDoKCXNyYi0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwoKCS8qIHBlcm1pdCB0aGUgcmVzZXQgdHJhbnNmZXIgdG8gdGFrZSBwbGFjZSAqLwoJY2xlYXJfYml0KFVTX0ZMSURYX0FCT1JUSU5HLCAmdXMtPmRmbGFncyk7CgkvKiBOZWVkIHJlc2V0IGhlcmUgKi8KfQoKI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRwpzdGF0aWMgdm9pZCBpc2QyMDBfbG9nX2NvbmZpZyggc3RydWN0IGlzZDIwMF9pbmZvKiBpbmZvICkKewoJVVNfREVCVUdQKCIgICAgICBFdmVudCBOb3RpZmljYXRpb246IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5FdmVudE5vdGlmaWNhdGlvbik7CglVU19ERUJVR1AoIiAgICAgIEV4dGVybmFsIENsb2NrOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuRXh0ZXJuYWxDbG9jayk7CglVU19ERUJVR1AoIiAgICAgIEFUQSBJbml0IFRpbWVvdXQ6IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFJbml0VGltZW91dCk7CglVU19ERUJVR1AoIiAgICAgIEFUQVBJIENvbW1hbmQgQmxvY2sgU2l6ZTogMHgleFxuIiwgCgkJICAoaW5mby0+Q29uZmlnRGF0YS5BVEFDb25maWcgJiBBVEFDRkdfQkxPQ0tTSVpFKSA+PiA2KTsKCVVTX0RFQlVHUCgiICAgICAgTWFzdGVyL1NsYXZlIFNlbGVjdGlvbjogMHgleFxuIiwgCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyAmIEFUQUNGR19NQVNURVIpOwoJVVNfREVCVUdQKCIgICAgICBBVEFQSSBSZXNldDogMHgleFxuIiwKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBQ29uZmlnICYgQVRBQ0ZHX0FUQVBJX1JFU0VUKTsKCVVTX0RFQlVHUCgiICAgICAgQVRBIFRpbWluZzogMHgleFxuIiwKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBQ29uZmlnICYgQVRBQ0ZHX1RJTUlORyk7CglVU19ERUJVR1AoIiAgICAgIEFUQSBNYWpvciBDb21tYW5kOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kKTsKCVVTX0RFQlVHUCgiICAgICAgQVRBIE1pbm9yIENvbW1hbmQ6IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFNaW5vckNvbW1hbmQpOwoJVVNfREVCVUdQKCIgICAgICBJbml0IFN0YXR1czogMHgleFxuIiwgCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUV4dHJhQ29uZmlnICYgQVRBQ0ZHRV9JTklUX1NUQVRVUyk7CglVU19ERUJVR1AoIiAgICAgIENvbmZpZyBEZXNjcmlwdG9yIDI6IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfQ09ORl9ERVNDMik7CglVU19ERUJVR1AoIiAgICAgIFNraXAgRGV2aWNlIEJvb3Q6IDB4JXhcbiIsCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUV4dHJhQ29uZmlnICYgQVRBQ0ZHRV9TS0lQX0JPT1QpOwoJVVNfREVCVUdQKCIgICAgICBBVEEgMyBTdGF0ZSBTdXBzZW5kOiAweCV4XG4iLAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfU1RBVEVfU1VTUEVORCk7CglVU19ERUJVR1AoIiAgICAgIERlc2NyaXB0b3IgT3ZlcnJpZGU6IDB4JXhcbiIsIAoJCSAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfREVTQ19PVkVSUklERSk7CglVU19ERUJVR1AoIiAgICAgIExhc3QgTFVOIElkZW50aWZpZXI6IDB4JXhcbiIsCgkJICBpbmZvLT5Db25maWdEYXRhLkFUQUV4dHJhQ29uZmlnICYgQVRBQ0ZHRV9MQVNUX0xVTik7CglVU19ERUJVR1AoIiAgICAgIFNSU1QgRW5hYmxlOiAweCV4XG4iLCAKCQkgIGluZm8tPkNvbmZpZ0RhdGEuQVRBRXh0cmFDb25maWcgJiBDRkdfQ0FQQUJJTElUWV9TUlNUKTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfd3JpdGVfY29uZmlnCiAqCQkJCQkJCQkJIAogKiBXcml0ZSB0aGUgSVNEMjAwIENvbmZpZ3VyYXRpb24gZGF0YQogKgogKiBSRVRVUk5TOgogKiAgICBJU0Qgc3RhdHVzIGNvZGUKICovCnN0YXRpYyBpbnQgaXNkMjAwX3dyaXRlX2NvbmZpZyggc3RydWN0IHVzX2RhdGEgKnVzICkgCnsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CglpbnQgcmVzdWx0OwoKI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRwoJVVNfREVCVUdQKCJFbnRlcmluZyBpc2QyMDBfd3JpdGVfY29uZmlnXG4iKTsKCVVTX0RFQlVHUCgiICAgV3JpdGluZyB0aGUgZm9sbG93aW5nIElTRDIwMCBDb25maWcgRGF0YTpcbiIpOwoJaXNkMjAwX2xvZ19jb25maWcoaW5mbyk7CiNlbmRpZgoKCS8qIGxldCdzIHNlbmQgdGhlIGNvbW1hbmQgdmlhIHRoZSBjb250cm9sIHBpcGUgKi8KCXJlc3VsdCA9IHVzYl9zdG9yX2N0cmxfdHJhbnNmZXIoCgkJdXMsIAoJCXVzLT5zZW5kX2N0cmxfcGlwZSwKCQkweDAxLCAKCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCgkJMHgwMDAwLCAKCQkweDAwMDIsIAoJCSh2b2lkICopICZpbmZvLT5Db25maWdEYXRhLCAKCQlzaXplb2YoaW5mby0+Q29uZmlnRGF0YSkpOwoKCWlmIChyZXN1bHQgPj0gMCkgewoJCVVTX0RFQlVHUCgiICAgSVNEMjAwIENvbmZpZyBEYXRhIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseVxuIik7Cgl9IGVsc2UgewoJCVVTX0RFQlVHUCgiICAgUmVxdWVzdCB0byB3cml0ZSBJU0QyMDAgQ29uZmlnIERhdGEgZmFpbGVkIVxuIik7CgkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJfQoKCVVTX0RFQlVHUCgiTGVhdmluZyBpc2QyMDBfd3JpdGVfY29uZmlnICUwOFhcbiIsIHJldFN0YXR1cyk7CglyZXR1cm4gcmV0U3RhdHVzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9yZWFkX2NvbmZpZwogKgkJCQkJCQkJCSAKICogUmVhZHMgdGhlIElTRDIwMCBDb25maWd1cmF0aW9uIGRhdGEKICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9yZWFkX2NvbmZpZyggc3RydWN0IHVzX2RhdGEgKnVzICkgCnsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CglpbnQgcmVzdWx0OwoKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX3JlYWRfY29uZmlnXG4iKTsKCgkvKiByZWFkIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gSVNEMjAwLiAgVXNlIHRoaXMgdG8gKi8KCS8qIGRldGVybWluZSB3aGF0IHRoZSBzcGVjaWFsIEFUQSBDREIgYnl0ZXMgYXJlLgkJKi8KCglyZXN1bHQgPSB1c2Jfc3Rvcl9jdHJsX3RyYW5zZmVyKAoJCXVzLCAKCQl1cy0+cmVjdl9jdHJsX3BpcGUsCgkJMHgwMiwgCgkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCgkJMHgwMDAwLCAKCQkweDAwMDIsIAoJCSh2b2lkICopICZpbmZvLT5Db25maWdEYXRhLCAKCQlzaXplb2YoaW5mby0+Q29uZmlnRGF0YSkpOwoKCglpZiAocmVzdWx0ID49IDApIHsKCQlVU19ERUJVR1AoIiAgIFJldHJpZXZlZCB0aGUgZm9sbG93aW5nIElTRDIwMCBDb25maWcgRGF0YTpcbiIpOwojaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHCgkJaXNkMjAwX2xvZ19jb25maWcoaW5mbyk7CiNlbmRpZgoJfSBlbHNlIHsKCQlVU19ERUJVR1AoIiAgIFJlcXVlc3QgdG8gZ2V0IElTRDIwMCBDb25maWcgRGF0YSBmYWlsZWQhXG4iKTsKCQlyZXRTdGF0dXMgPSBJU0QyMDBfRVJST1I7Cgl9CgoJVVNfREVCVUdQKCJMZWF2aW5nIGlzZDIwMF9yZWFkX2NvbmZpZyAlMDhYXG4iLCByZXRTdGF0dXMpOwoJcmV0dXJuIHJldFN0YXR1czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfYXRhcGlfc29mdF9yZXNldAogKgkJCQkJCQkJCSAKICogUGVyZm9ybSBhbiBBdGFwaSBTb2Z0IFJlc2V0IG9uIHRoZSBkZXZpY2UKICoKICogUkVUVVJOUzoKICogICAgTlQgc3RhdHVzIGNvZGUKICovCnN0YXRpYyBpbnQgaXNkMjAwX2F0YXBpX3NvZnRfcmVzZXQoIHN0cnVjdCB1c19kYXRhICp1cyApIAp7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CglpbnQgdHJhbnNmZXJTdGF0dXM7CgoJVVNfREVCVUdQKCJFbnRlcmluZyBpc2QyMDBfYXRhcGlfc29mdF9yZXNldFxuIik7CgoJdHJhbnNmZXJTdGF0dXMgPSBpc2QyMDBfYWN0aW9uKCB1cywgQUNUSU9OX1NPRlRfUkVTRVQsIE5VTEwsIDAgKTsKCWlmICh0cmFuc2ZlclN0YXR1cyAhPSBJU0QyMDBfVFJBTlNQT1JUX0dPT0QpIHsKCQlVU19ERUJVR1AoIiAgIEVycm9yIGlzc3VpbmcgQXRhcGkgU29mdCBSZXNldFxuIik7CgkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJfQoKCVVTX0RFQlVHUCgiTGVhdmluZyBpc2QyMDBfYXRhcGlfc29mdF9yZXNldCAlMDhYXG4iLCByZXRTdGF0dXMpOwoJcmV0dXJuIHJldFN0YXR1czsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfc3JzdAogKgkJCQkJCQkJCSAKICogUGVyZm9ybSBhbiBTUlNUIG9uIHRoZSBkZXZpY2UKICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9zcnN0KCBzdHJ1Y3QgdXNfZGF0YSAqdXMgKSAKewoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJaW50IHRyYW5zZmVyU3RhdHVzOwoKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX1NSU1RcbiIpOwoKCXRyYW5zZmVyU3RhdHVzID0gaXNkMjAwX2FjdGlvbiggdXMsIEFDVElPTl9SRVNFVCwgTlVMTCwgMCApOwoKCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGlzIHJlcXVlc3QgZmFpbGVkICovCglpZiAodHJhbnNmZXJTdGF0dXMgIT0gSVNEMjAwX1RSQU5TUE9SVF9HT09EKSB7CgkJVVNfREVCVUdQKCIgICBFcnJvciBpc3N1aW5nIFNSU1RcbiIpOwoJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCX0gZWxzZSB7CgkJLyogZGVsYXkgMTBtcyB0byBnaXZlIHRoZSBkcml2ZSBhIGNoYW5jZSB0byBzZWUgaXQgKi8KCQltc2xlZXAoMTApOwoKCQl0cmFuc2ZlclN0YXR1cyA9IGlzZDIwMF9hY3Rpb24oIHVzLCBBQ1RJT05fUkVFTkFCTEUsIE5VTEwsIDAgKTsKCQlpZiAodHJhbnNmZXJTdGF0dXMgIT0gSVNEMjAwX1RSQU5TUE9SVF9HT09EKSB7CgkJCVVTX0RFQlVHUCgiICAgRXJyb3IgdGFraW5nIGRyaXZlIG91dCBvZiByZXNldFxuIik7CgkJCXJldFN0YXR1cyA9IElTRDIwMF9FUlJPUjsKCQl9IGVsc2UgewoJCQkvKiBkZWxheSA1MG1zIHRvIGdpdmUgdGhlIGRyaXZlIGEgY2hhbmNlIHRvIHJlY292ZXIgYWZ0ZXIgU1JTVCAqLwoJCQltc2xlZXAoNTApOwoJCX0KCX0KCglVU19ERUJVR1AoIkxlYXZpbmcgaXNkMjAwX3Nyc3QgJTA4WFxuIiwgcmV0U3RhdHVzKTsKCXJldHVybiByZXRTdGF0dXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX3RyeV9lbnVtCiAqCQkJCQkJCQkJIAogKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGlzZDIwMF9tYW51YWxfZW51bSgpLiBEb2VzIEVOVU0gYW5kIFJFQURfU1RBVFVTCiAqIGFuZCB0cmllcyB0byBhbmFseXplIHRoZSBzdGF0dXMgcmVnaXN0ZXJzCiAqCiAqIFJFVFVSTlM6CiAqICAgIElTRCBzdGF0dXMgY29kZQogKi8Kc3RhdGljIGludCBpc2QyMDBfdHJ5X2VudW0oc3RydWN0IHVzX2RhdGEgKnVzLCB1bnNpZ25lZCBjaGFyIG1hc3Rlcl9zbGF2ZSwKCQkJICAgaW50IGRldGVjdCApCnsKCWludCBzdGF0dXMgPSBJU0QyMDBfR09PRDsKCXVuc2lnbmVkIGxvbmcgZW5kVGltZTsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7Cgl1bnNpZ25lZCBjaGFyICpyZWdzID0gaW5mby0+UmVnc0J1ZjsKCWludCByZWNoZWNrQXNNYXN0ZXIgPSAwOwoKCWlmICggZGV0ZWN0ICkKCQllbmRUaW1lID0gamlmZmllcyArIElTRDIwMF9FTlVNX0RFVEVDVF9USU1FT1VUICogSFo7CgllbHNlCgkJZW5kVGltZSA9IGppZmZpZXMgKyBJU0QyMDBfRU5VTV9CU1lfVElNRU9VVCAqIEhaOwoKCS8qIGxvb3AgdW50aWwgd2UgZGV0ZWN0ICFCU1kgb3IgdGltZW91dCAqLwoJd2hpbGUoMSkgewojaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHCgkJY2hhciogbXN0ciA9IG1hc3Rlcl9zbGF2ZSA9PSBBVEFfQUREUkVTU19ERVZIRUFEX1NURCA/CgkJCSJNYXN0ZXIiIDogIlNsYXZlIjsKI2VuZGlmCgoJCXN0YXR1cyA9IGlzZDIwMF9hY3Rpb24oIHVzLCBBQ1RJT05fRU5VTSwgTlVMTCwgbWFzdGVyX3NsYXZlICk7CgkJaWYgKCBzdGF0dXMgIT0gSVNEMjAwX0dPT0QgKQoJCQlicmVhazsKCgkJc3RhdHVzID0gaXNkMjAwX2FjdGlvbiggdXMsIEFDVElPTl9SRUFEX1NUQVRVUywgCgkJCQkJcmVncywgOCApOwoJCWlmICggc3RhdHVzICE9IElTRDIwMF9HT09EICkKCQkJYnJlYWs7CgoJCWlmICghZGV0ZWN0KSB7CgkJCWlmIChyZWdzW0FUQV9SRUdfU1RBVFVTX09GRlNFVF0gJiBBVEFfQlVTWSkgewoJCQkJVVNfREVCVUdQKCIgICAlcyBzdGF0dXMgaXMgc3RpbGwgQlNZLCB0cnkgYWdhaW4uLi5cbiIsbXN0cik7CgkJCX0gZWxzZSB7CgkJCQlVU19ERUJVR1AoIiAgICVzIHN0YXR1cyAhQlNZLCBjb250aW51ZSB3aXRoIG5leHQgb3BlcmF0aW9uXG4iLG1zdHIpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJLyogY2hlY2sgZm9yIEFUQV9CVVNZIGFuZCAqLwoJCS8qIEFUQV9ERiAod29ya2Fyb3VuZCBBVEEgWmlwIGRyaXZlKSBhbmQgKi8KCQkvKiBBVEFfRVJSICh3b3JrYXJvdW5kIGZvciBBcmNob3MgQ0QtUk9NKSAqLwoJCWVsc2UgaWYgKHJlZ3NbQVRBX1JFR19TVEFUVVNfT0ZGU0VUXSAmCgkJCSAoQVRBX0JVU1kgfCBBVEFfREYgfCBBVEFfRVJSKSkgewoJCQlVU19ERUJVR1AoIiAgIFN0YXR1cyBpbmRpY2F0ZXMgaXQgaXMgbm90IHJlYWR5LCB0cnkgYWdhaW4uLi5cbiIpOwoJCX0KCQkvKiBjaGVjayBmb3IgRFJEWSwgQVRBIGRldmljZXMgc2V0IERSRFkgYWZ0ZXIgU1JTVCAqLwoJCWVsc2UgaWYgKHJlZ3NbQVRBX1JFR19TVEFUVVNfT0ZGU0VUXSAmIEFUQV9EUkRZKSB7CgkJCVVTX0RFQlVHUCgiICAgSWRlbnRpZmllZCBBVEEgZGV2aWNlXG4iKTsKCQkJaW5mby0+RGV2aWNlRmxhZ3MgfD0gREZfQVRBX0RFVklDRTsKCQkJaW5mby0+RGV2aWNlSGVhZCA9IG1hc3Rlcl9zbGF2ZTsKCQkJYnJlYWs7CgkJfSAKCQkvKiBjaGVjayBDeWxpbmRlciBIaWdoL0xvdyB0bwoJCSAgIGRldGVybWluZSBpZiBpdCBpcyBhbiBBVEFQSSBkZXZpY2UKCQkqLwoJCWVsc2UgaWYgKHJlZ3NbQVRBX1JFR19IQ1lMX09GRlNFVF0gPT0gMHhFQiAmJgoJCQkgcmVnc1tBVEFfUkVHX0xDWUxfT0ZGU0VUXSA9PSAweDE0KSB7CgkJCS8qIEl0IHNlZW1zIHRoYXQgdGhlIFJJQ09IIAoJCQkgICBNUDYyMDBBIENEL1JXIGRyaXZlIHdpbGwgCgkJCSAgIHJlcG9ydCBpdHNlbGYgb2theSBhcyBhCgkJCSAgIHNsYXZlIHdoZW4gaXQgaXMgcmVhbGx5IGEKCQkJICAgbWFzdGVyLiBTbyB0aGlzIGNoZWNrIGFnYWluCgkJCSAgIGFzIGEgbWFzdGVyIGRldmljZSBqdXN0IHRvCgkJCSAgIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHJlcG9ydAoJCQkgICBpdHNlbGYgb2theSBhcyBhIG1hc3RlciBhbHNvCgkJCSovCgkJCWlmICgobWFzdGVyX3NsYXZlICYgQVRBX0FERFJFU1NfREVWSEVBRF9TTEFWRSkgJiYKCQkJICAgICFyZWNoZWNrQXNNYXN0ZXIpIHsKCQkJCVVTX0RFQlVHUCgiICAgSWRlbnRpZmllZCBBVEFQSSBkZXZpY2UgYXMgc2xhdmUuICBSZWNoZWNraW5nIGFnYWluIGFzIG1hc3RlclxuIik7CgkJCQlyZWNoZWNrQXNNYXN0ZXIgPSAxOwoJCQkJbWFzdGVyX3NsYXZlID0gQVRBX0FERFJFU1NfREVWSEVBRF9TVEQ7CgkJCX0gZWxzZSB7CgkJCQlVU19ERUJVR1AoIiAgIElkZW50aWZpZWQgQVRBUEkgZGV2aWNlXG4iKTsKCQkJCWluZm8tPkRldmljZUhlYWQgPSBtYXN0ZXJfc2xhdmU7CgkJCSAgICAgIAoJCQkJc3RhdHVzID0gaXNkMjAwX2F0YXBpX3NvZnRfcmVzZXQodXMpOwoJCQkJYnJlYWs7CgkJCX0KCQl9IGVsc2UgewogCQkJVVNfREVCVUdQKCIgICBOb3QgQVRBLCBub3QgQVRBUEkuIFdlaXJkLlxuIik7CgkJCWJyZWFrOwoJCX0KCgkJLyogY2hlY2sgZm9yIHRpbWVvdXQgb24gdGhpcyByZXF1ZXN0ICovCgkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kVGltZSkpIHsKCQkJaWYgKCFkZXRlY3QpCgkJCQlVU19ERUJVR1AoIiAgIEJTWSBjaGVjayB0aW1lb3V0LCBqdXN0IGNvbnRpbnVlIHdpdGggbmV4dCBvcGVyYXRpb24uLi5cbiIpOwoJCQllbHNlCgkJCQlVU19ERUJVR1AoIiAgIERldmljZSBkZXRlY3QgdGltZW91dCFcbiIpOwoJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9tYW51YWxfZW51bQogKgkJCQkJCQkJCSAKICogRGV0ZXJtaW5lcyBpZiB0aGUgZHJpdmUgYXR0YWNoZWQgaXMgYW4gQVRBIG9yIEFUQVBJIGFuZCBpZiBpdCBpcyBhCiAqIG1hc3RlciBvciBzbGF2ZS4KICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9tYW51YWxfZW51bShzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXN0cnVjdCBpc2QyMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKil1cy0+ZXh0cmE7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CgoJVVNfREVCVUdQKCJFbnRlcmluZyBpc2QyMDBfbWFudWFsX2VudW1cbiIpOwoKCXJldFN0YXR1cyA9IGlzZDIwMF9yZWFkX2NvbmZpZyh1cyk7CglpZiAocmV0U3RhdHVzID09IElTRDIwMF9HT09EKSB7CgkJaW50IGlzc2xhdmU7CgkJLyogbWFzdGVyIG9yIHNsYXZlPyAqLwoJCXJldFN0YXR1cyA9IGlzZDIwMF90cnlfZW51bSggdXMsIEFUQV9BRERSRVNTX0RFVkhFQURfU1RELCAwKTsKCQlpZiAocmV0U3RhdHVzID09IElTRDIwMF9HT09EKQoJCQlyZXRTdGF0dXMgPSBpc2QyMDBfdHJ5X2VudW0oIHVzLCBBVEFfQUREUkVTU19ERVZIRUFEX1NMQVZFLCAwKTsKCgkJaWYgKHJldFN0YXR1cyA9PSBJU0QyMDBfR09PRCkgewoJCQlyZXRTdGF0dXMgPSBpc2QyMDBfc3JzdCh1cyk7CgkJCWlmIChyZXRTdGF0dXMgPT0gSVNEMjAwX0dPT0QpCgkJCQkvKiBhdGEgb3IgYXRhcGk/ICovCgkJCQlyZXRTdGF0dXMgPSBpc2QyMDBfdHJ5X2VudW0oIHVzLCBBVEFfQUREUkVTU19ERVZIRUFEX1NURCwgMSk7CgkJfQoKCQlpc3NsYXZlID0gKGluZm8tPkRldmljZUhlYWQgJiBBVEFfQUREUkVTU19ERVZIRUFEX1NMQVZFKSA/IDEgOiAwOwoJCWlmICghKGluZm8tPkNvbmZpZ0RhdGEuQVRBQ29uZmlnICYgQVRBQ0ZHX01BU1RFUikpIHsKCQkJVVNfREVCVUdQKCIgICBTZXR0aW5nIE1hc3Rlci9TbGF2ZSBzZWxlY3Rpb24gdG8gJWRcbiIsIGlzc2xhdmUpOwoJCQlpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyAmPSAweDNmOwoJCQlpbmZvLT5Db25maWdEYXRhLkFUQUNvbmZpZyB8PSAoaXNzbGF2ZTw8Nik7CgkJCXJldFN0YXR1cyA9IGlzZDIwMF93cml0ZV9jb25maWcodXMpOwoJCX0KCX0KCglVU19ERUJVR1AoIkxlYXZpbmcgaXNkMjAwX21hbnVhbF9lbnVtICUwOFhcbiIsIHJldFN0YXR1cyk7CglyZXR1cm4ocmV0U3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgaXNkMjAwX2ZpeF9kcml2ZWlkKHUxNiAqaWQpCnsKI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU4KIyBpZmRlZiBfX0JJR19FTkRJQU4KCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBBVEFfSURfV09SRFM7IGkrKykKCQlpZFtpXSA9IF9fbGUxNl90b19jcHUoaWRbaV0pOwojIGVsc2UKIyAgZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiMgZW5kaWYKI2VuZGlmCn0KCnN0YXRpYyB2b2lkIGlzZDIwMF9kdW1wX2RyaXZlaWQodTE2ICppZCkKewoJVVNfREVCVUdQKCIgICBJZGVudGlmeSBEYXRhIFN0cnVjdHVyZTpcbiIpOwoJVVNfREVCVUdQKCIgICAgICBjb25maWcgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9DT05GSUddKTsKCVVTX0RFQlVHUCgiICAgICAgY3lscyA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0NZTFNdKTsKCVVTX0RFQlVHUCgiICAgICAgaGVhZHMgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9IRUFEU10pOwoJVVNfREVCVUdQKCIgICAgICB0cmFja19ieXRlcyA9IDB4JXhcbiIsCSAgaWRbNF0pOwoJVVNfREVCVUdQKCIgICAgICBzZWN0b3JfYnl0ZXMgPSAweCV4XG4iLCAgaWRbNV0pOwoJVVNfREVCVUdQKCIgICAgICBzZWN0b3JzID0gMHgleFxuIiwJICBpZFtBVEFfSURfU0VDVE9SU10pOwoJVVNfREVCVUdQKCIgICAgICBzZXJpYWxfbm9bMF0gPSAweCV4XG4iLCAgKihjaGFyICopJmlkW0FUQV9JRF9TRVJOT10pOwoJVVNfREVCVUdQKCIgICAgICBidWZfdHlwZSA9IDB4JXhcbiIsCSAgaWRbMjBdKTsKCVVTX0RFQlVHUCgiICAgICAgYnVmX3NpemUgPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9CVUZfU0laRV0pOwoJVVNfREVCVUdQKCIgICAgICBlY2NfYnl0ZXMgPSAweCV4XG4iLAkgIGlkWzIyXSk7CglVU19ERUJVR1AoIiAgICAgIGZ3X3JldlswXSA9IDB4JXhcbiIsCSAgKihjaGFyICopJmlkW0FUQV9JRF9GV19SRVZdKTsKCVVTX0RFQlVHUCgiICAgICAgbW9kZWxbMF0gPSAweCV4XG4iLAkgICooY2hhciAqKSZpZFtBVEFfSURfUFJPRF0pOwoJVVNfREVCVUdQKCIgICAgICBtYXhfbXVsdHNlY3QgPSAweCV4XG4iLCAgaWRbQVRBX0lEX01BWF9NVUxUU0VDVF0gJiAweGZmKTsKCVVTX0RFQlVHUCgiICAgICAgZHdvcmRfaW8gPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9EV09SRF9JT10pOwoJVVNfREVCVUdQKCIgICAgICBjYXBhYmlsaXR5ID0gMHgleFxuIiwJICBpZFtBVEFfSURfQ0FQQUJJTElUWV0gPj4gOCk7CglVU19ERUJVR1AoIiAgICAgIHRQSU8gPSAweCV4XG4iLAkgIGlkW0FUQV9JRF9PTERfUElPX01PREVTXSA+PiA4KTsKCVVTX0RFQlVHUCgiICAgICAgdERNQSA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX09MRF9ETUFfTU9ERVNdID4+IDgpOwoJVVNfREVCVUdQKCIgICAgICBmaWVsZF92YWxpZCA9IDB4JXhcbiIsCSAgaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSk7CglVU19ERUJVR1AoIiAgICAgIGN1cl9jeWxzID0gMHgleFxuIiwJICBpZFtBVEFfSURfQ1VSX0NZTFNdKTsKCVVTX0RFQlVHUCgiICAgICAgY3VyX2hlYWRzID0gMHgleFxuIiwJICBpZFtBVEFfSURfQ1VSX0hFQURTXSk7CglVU19ERUJVR1AoIiAgICAgIGN1cl9zZWN0b3JzID0gMHgleFxuIiwJICBpZFtBVEFfSURfQ1VSX1NFQ1RPUlNdKTsKCVVTX0RFQlVHUCgiICAgICAgY3VyX2NhcGFjaXR5ID0gMHgleFxuIiwgIGF0YV9pZF91MzIoaWQsIDU3KSk7CglVU19ERUJVR1AoIiAgICAgIG11bHRzZWN0ID0gMHgleFxuIiwJICBpZFtBVEFfSURfTVVMVFNFQ1RdICYgMHhmZik7CglVU19ERUJVR1AoIiAgICAgIGxiYV9jYXBhY2l0eSA9IDB4JXhcbiIsICBhdGFfaWRfdTMyKGlkLCBBVEFfSURfTEJBX0NBUEFDSVRZKSk7CglVU19ERUJVR1AoIiAgICAgIGNvbW1hbmRfc2V0XzEgPSAweCV4XG4iLCBpZFtBVEFfSURfQ09NTUFORF9TRVRfMV0pOwoJVVNfREVCVUdQKCIgICAgICBjb21tYW5kX3NldF8yID0gMHgleFxuIiwgaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzJdKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGlzZDIwMF9nZXRfaW5xdWlyeV9kYXRhCiAqCiAqIEdldCBpbnF1aXJ5IGRhdGEKICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9nZXRfaW5xdWlyeV9kYXRhKCBzdHJ1Y3QgdXNfZGF0YSAqdXMgKQp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopdXMtPmV4dHJhOwoJaW50IHJldFN0YXR1cyA9IElTRDIwMF9HT09EOwoJdTE2ICppZCA9IGluZm8tPmlkOwoKCVVTX0RFQlVHUCgiRW50ZXJpbmcgaXNkMjAwX2dldF9pbnF1aXJ5X2RhdGFcbiIpOwoKCS8qIHNldCBkZWZhdWx0IHRvIE1hc3RlciAqLwoJaW5mby0+RGV2aWNlSGVhZCA9IEFUQV9BRERSRVNTX0RFVkhFQURfU1REOwoKCS8qIGF0dGVtcHQgdG8gbWFudWFsbHkgZW51bWVyYXRlIHRoaXMgZGV2aWNlICovCglyZXRTdGF0dXMgPSBpc2QyMDBfbWFudWFsX2VudW0odXMpOwoJaWYgKHJldFN0YXR1cyA9PSBJU0QyMDBfR09PRCkgewoJCWludCB0cmFuc2ZlclN0YXR1czsKCgkJLyogY2hlY2sgZm9yIGFuIEFUQSBkZXZpY2UgKi8KCQlpZiAoaW5mby0+RGV2aWNlRmxhZ3MgJiBERl9BVEFfREVWSUNFKSB7CgkJCS8qIHRoaXMgbXVzdCBiZSBhbiBBVEEgZGV2aWNlICovCgkJCS8qIHBlcmZvcm0gYW4gQVRBIENvbW1hbmQgSWRlbnRpZnkgKi8KCQkJdHJhbnNmZXJTdGF0dXMgPSBpc2QyMDBfYWN0aW9uKCB1cywgQUNUSU9OX0lERU5USUZZLAoJCQkJCQkJaWQsIEFUQV9JRF9XT1JEUyAqIDIpOwoJCQlpZiAodHJhbnNmZXJTdGF0dXMgIT0gSVNEMjAwX1RSQU5TUE9SVF9HT09EKSB7CgkJCQkvKiBFcnJvciBpc3N1aW5nIEFUQSBDb21tYW5kIElkZW50aWZ5ICovCgkJCQlVU19ERUJVR1AoIiAgIEVycm9yIGlzc3VpbmcgQVRBIENvbW1hbmQgSWRlbnRpZnlcbiIpOwoJCQkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJCQl9IGVsc2UgewoJCQkJLyogQVRBIENvbW1hbmQgSWRlbnRpZnkgc3VjY2Vzc2Z1bCAqLwoJCQkJaW50IGk7CgkJCQlfX2JlMTYgKnNyYzsKCQkJCV9fdTE2ICpkZXN0OwoKCQkJCWlzZDIwMF9maXhfZHJpdmVpZChpZCk7CgkJCQlpc2QyMDBfZHVtcF9kcml2ZWlkKGlkKTsKCgkJCQltZW1zZXQoJmluZm8tPklucXVpcnlEYXRhLCAwLCBzaXplb2YoaW5mby0+SW5xdWlyeURhdGEpKTsKCgkJCQkvKiBTdGFuZGFyZCBJREUgaW50ZXJmYWNlIG9ubHkgc3VwcG9ydHMgZGlza3MgKi8KCQkJCWluZm8tPklucXVpcnlEYXRhLkRldmljZVR5cGUgPSBESVJFQ1RfQUNDRVNTX0RFVklDRTsKCgkJCQkvKiBUaGUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMzYgKDUgKyAzMSkgKi8KCQkJCWluZm8tPklucXVpcnlEYXRhLkFkZGl0aW9uYWxMZW5ndGggPSAweDFGOwoKCQkJCWlmIChpZFtBVEFfSURfQ09NTUFORF9TRVRfMV0gJiBDT01NQU5EU0VUX01FRElBX1NUQVRVUykgewoJCQkJCS8qIHNldCB0aGUgcmVtb3ZhYmxlIGJpdCAqLwoJCQkJCWluZm8tPklucXVpcnlEYXRhLkRldmljZVR5cGVNb2RpZmllciA9IERFVklDRV9SRU1PVkFCTEU7CgkJCQkJaW5mby0+RGV2aWNlRmxhZ3MgfD0gREZfUkVNT1ZBQkxFX01FRElBOwoJCQkJfQoKCQkJCS8qIEZpbGwgaW4gdmVuZG9yIGlkZW50aWZpY2F0aW9uIGZpZWxkcyAqLwoJCQkJc3JjID0gKF9fYmUxNiAqKSZpZFtBVEFfSURfUFJPRF07CgkJCQlkZXN0ID0gKF9fdTE2KilpbmZvLT5JbnF1aXJ5RGF0YS5WZW5kb3JJZDsKCQkJCWZvciAoaT0wO2k8NDtpKyspCgkJCQkJZGVzdFtpXSA9IGJlMTZfdG9fY3B1KHNyY1tpXSk7CgoJCQkJc3JjID0gKF9fYmUxNiAqKSZpZFtBVEFfSURfUFJPRCArIDgvMl07CgkJCQlkZXN0ID0gKF9fdTE2KilpbmZvLT5JbnF1aXJ5RGF0YS5Qcm9kdWN0SWQ7CgkJCQlmb3IgKGk9MDtpPDg7aSsrKQoJCQkJCWRlc3RbaV0gPSBiZTE2X3RvX2NwdShzcmNbaV0pOwoKCQkJCXNyYyA9IChfX2JlMTYgKikmaWRbQVRBX0lEX0ZXX1JFVl07CgkJCQlkZXN0ID0gKF9fdTE2KilpbmZvLT5JbnF1aXJ5RGF0YS5Qcm9kdWN0UmV2aXNpb25MZXZlbDsKCQkJCWZvciAoaT0wO2k8MjtpKyspCgkJCQkJZGVzdFtpXSA9IGJlMTZfdG9fY3B1KHNyY1tpXSk7CgoJCQkJLyogZGV0ZXJtaW5lIGlmIGl0IHN1cHBvcnRzIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gKi8KCQkJCWlmIChpZFtBVEFfSURfQ09NTUFORF9TRVRfMl0gJiBDT01NQU5EU0VUX01FRElBX1NUQVRVUykgewoJCQkJCVVTX0RFQlVHUCgiICAgRGV2aWNlIHN1cHBvcnRzIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb25cbiIpOwoKCQkJCQkvKiBJbmRpY2F0ZSB0aGF0IGl0IGlzIGVuYWJsZWQsIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdAoJCQkJCSAqIFRoaXMgYWxsb3dzIHRoZSBsb2NrL3VubG9jayBvZiB0aGUgbWVkaWEgdG8gd29yawoJCQkJCSAqIGNvcnJlY3RseS4KCQkJCQkgKi8KCQkJCQlpbmZvLT5EZXZpY2VGbGFncyB8PSBERl9NRURJQV9TVEFUVVNfRU5BQkxFRDsKCQkJCX0KCQkJCWVsc2UKCQkJCQlpbmZvLT5EZXZpY2VGbGFncyAmPSB+REZfTUVESUFfU1RBVFVTX0VOQUJMRUQ7CgoJCQl9CgkJfSBlbHNlIHsKCQkJLyogCgkJCSAqIHRoaXMgbXVzdCBiZSBhbiBBVEFQSSBkZXZpY2UgCgkJCSAqIHVzZSBhbiBBVEFQSSBwcm90b2NvbCAoVHJhbnNwYXJlbnQgU0NTSSkKCQkJICovCgkJCXVzLT5wcm90b2NvbF9uYW1lID0gIlRyYW5zcGFyZW50IFNDU0kiOwoJCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3RyYW5zcGFyZW50X3Njc2lfY29tbWFuZDsKCgkJCVVTX0RFQlVHUCgiUHJvdG9jb2wgY2hhbmdlZCB0bzogJXNcbiIsIHVzLT5wcm90b2NvbF9uYW1lKTsKCSAgICAKCQkJLyogRnJlZSBkcml2ZXIgc3RydWN0dXJlICovCSAgICAKCQkJdXMtPmV4dHJhX2Rlc3RydWN0b3IoaW5mbyk7CgkJCWtmcmVlKGluZm8pOwoJCQl1cy0+ZXh0cmEgPSBOVUxMOwoJCQl1cy0+ZXh0cmFfZGVzdHJ1Y3RvciA9IE5VTEw7CgkJfQoJfQoKCVVTX0RFQlVHUCgiTGVhdmluZyBpc2QyMDBfZ2V0X2lucXVpcnlfZGF0YSAlMDhYXG4iLCByZXRTdGF0dXMpOwoKCXJldHVybihyZXRTdGF0dXMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX3Njc2lfdG9fYXRhCiAqCQkJCQkJCQkJIAogKiBUcmFuc2xhdGUgU0NTSSBjb21tYW5kcyB0byBBVEEgY29tbWFuZHMuCiAqCiAqIFJFVFVSTlM6CiAqICAgIDEgaWYgdGhlIGNvbW1hbmQgbmVlZHMgdG8gYmUgc2VudCB0byB0aGUgdHJhbnNwb3J0IGxheWVyCiAqICAgIDAgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9zY3NpX3RvX2F0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cywKCQkJICAgICAgdW5pb24gYXRhX2NkYiAqIGF0YUNkYikKewoJc3RydWN0IGlzZDIwMF9pbmZvICppbmZvID0gKHN0cnVjdCBpc2QyMDBfaW5mbyAqKXVzLT5leHRyYTsKCXUxNiAqaWQgPSBpbmZvLT5pZDsKCWludCBzZW5kVG9UcmFuc3BvcnQgPSAxOwoJdW5zaWduZWQgY2hhciBzZWN0bnVtLCBoZWFkOwoJdW5zaWduZWQgc2hvcnQgY3lsaW5kZXI7Cgl1bnNpZ25lZCBsb25nIGxiYTsKCXVuc2lnbmVkIGxvbmcgYmxvY2tDb3VudDsKCXVuc2lnbmVkIGNoYXIgc2Vuc2VEYXRhWzhdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CgoJbWVtc2V0KGF0YUNkYiwgMCwgc2l6ZW9mKHVuaW9uIGF0YV9jZGIpKTsKCgkvKiBTQ1NJIENvbW1hbmQgKi8KCXN3aXRjaCAoc3JiLT5jbW5kWzBdKSB7CgljYXNlIElOUVVJUlk6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gSU5RVUlSWVxuIik7CgoJCS8qIGNvcHkgSW5xdWlyeURhdGEgKi8KCQl1c2Jfc3Rvcl9zZXRfeGZlcl9idWYoKHVuc2lnbmVkIGNoYXIgKikgJmluZm8tPklucXVpcnlEYXRhLAoJCQkJc2l6ZW9mKGluZm8tPklucXVpcnlEYXRhKSwgc3JiKTsKCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CgkJc2VuZFRvVHJhbnNwb3J0ID0gMDsKCQlicmVhazsKCgljYXNlIE1PREVfU0VOU0U6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX01PREVfU0VOU0VcbiIpOwoKCQkvKiBJbml0aWFsaXplIHRoZSByZXR1cm4gYnVmZmVyICovCgkJdXNiX3N0b3Jfc2V0X3hmZXJfYnVmKHNlbnNlRGF0YSwgc2l6ZW9mKHNlbnNlRGF0YSksIHNyYik7CgoJCWlmIChpbmZvLT5EZXZpY2VGbGFncyAmIERGX01FRElBX1NUQVRVU19FTkFCTEVEKQoJCXsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUwID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNYWpvckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCQlhdGFDZGItPmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfQ09NTUFORDsKCQkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DT01NQU5EX0dFVF9NRURJQV9TVEFUVVM7CgkJCWlzZDIwMF9zcmJfc2V0X2J1ZmZsZW4oc3JiLCAwKTsKCQl9IGVsc2UgewoJCQlVU19ERUJVR1AoIiAgIE1lZGlhIFN0YXR1cyBub3Qgc3VwcG9ydGVkLCBqdXN0IHJlcG9ydCBva2F5XG4iKTsKCQkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwoJCQlzZW5kVG9UcmFuc3BvcnQgPSAwOwoJCX0KCQlicmVhazsKCgljYXNlIFRFU1RfVU5JVF9SRUFEWToKCQlVU19ERUJVR1AoIiAgIEFUQSBPVVQgLSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZXG4iKTsKCgkJaWYgKGluZm8tPkRldmljZUZsYWdzICYgREZfTUVESUFfU1RBVFVTX0VOQUJMRUQpCgkJewoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUxID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNaW5vckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDE7CgkJCWF0YUNkYi0+Z2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19DT01NQU5EOwoJCQlhdGFDZGItPndyaXRlLkNvbW1hbmRCeXRlID0gQVRBX0NPTU1BTkRfR0VUX01FRElBX1NUQVRVUzsKCQkJaXNkMjAwX3NyYl9zZXRfYnVmZmxlbihzcmIsIDApOwoJCX0gZWxzZSB7CgkJCVVTX0RFQlVHUCgiICAgTWVkaWEgU3RhdHVzIG5vdCBzdXBwb3J0ZWQsIGp1c3QgcmVwb3J0IG9rYXlcbiIpOwoJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CgkJCXNlbmRUb1RyYW5zcG9ydCA9IDA7CgkJfQoJCWJyZWFrOwoKCWNhc2UgUkVBRF9DQVBBQ0lUWToKCXsKCQl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OwoJCXN0cnVjdCByZWFkX2NhcGFjaXR5X2RhdGEgcmVhZENhcGFjaXR5RGF0YTsKCgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX1JFQURfQ0FQQUNJVFlcbiIpOwoKCQlpZiAoYXRhX2lkX2hhc19sYmEoaWQpKQoJCQljYXBhY2l0eSA9IGF0YV9pZF91MzIoaWQsIEFUQV9JRF9MQkFfQ0FQQUNJVFkpIC0gMTsKCQllbHNlCgkJCWNhcGFjaXR5ID0gKGlkW0FUQV9JRF9IRUFEU10gKiBpZFtBVEFfSURfQ1lMU10gKgoJCQkJICAgIGlkW0FUQV9JRF9TRUNUT1JTXSkgLSAxOwoKCQlyZWFkQ2FwYWNpdHlEYXRhLkxvZ2ljYWxCbG9ja0FkZHJlc3MgPSBjcHVfdG9fYmUzMihjYXBhY2l0eSk7CgkJcmVhZENhcGFjaXR5RGF0YS5CeXRlc1BlckJsb2NrID0gY3B1X3RvX2JlMzIoMHgyMDApOwoKCQl1c2Jfc3Rvcl9zZXRfeGZlcl9idWYoKHVuc2lnbmVkIGNoYXIgKikgJnJlYWRDYXBhY2l0eURhdGEsCgkJCQlzaXplb2YocmVhZENhcGFjaXR5RGF0YSksIHNyYik7CgkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwoJCXNlbmRUb1RyYW5zcG9ydCA9IDA7Cgl9CglicmVhazsKCgljYXNlIFJFQURfMTA6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX1JFQURcbiIpOwoKCQlsYmEgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKSZzcmItPmNtbmRbMl0pOwoJCWJsb2NrQ291bnQgPSAodW5zaWduZWQgbG9uZylzcmItPmNtbmRbN108PDggfCAodW5zaWduZWQgbG9uZylzcmItPmNtbmRbOF07CgoJCWlmIChhdGFfaWRfaGFzX2xiYShpZCkpIHsKCQkJc2VjdG51bSA9ICh1bnNpZ25lZCBjaGFyKShsYmEpOwoJCQljeWxpbmRlciA9ICh1bnNpZ25lZCBzaG9ydCkobGJhPj44KTsKCQkJaGVhZCA9IEFUQV9BRERSRVNTX0RFVkhFQURfTEJBX01PREUgfCAodW5zaWduZWQgY2hhcikobGJhPj4yNCAmIDB4MEYpOwoJCX0gZWxzZSB7CgkJCXNlY3RudW0gPSAodTgpKChsYmEgJSBpZFtBVEFfSURfU0VDVE9SU10pICsgMSk7CgkJCWN5bGluZGVyID0gKHUxNikobGJhIC8gKGlkW0FUQV9JRF9TRUNUT1JTXSAqCgkJCQkJaWRbQVRBX0lEX0hFQURTXSkpOwoJCQloZWFkID0gKHU4KSgobGJhIC8gaWRbQVRBX0lEX1NFQ1RPUlNdKSAlCgkJCQkJaWRbQVRBX0lEX0hFQURTXSk7CgkJfQoJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMCA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kOwoJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCWF0YUNkYi0+Z2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDE7CgkJYXRhQ2RiLT5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0KCQkgIFJFR19TRUNUT1JfQ09VTlQgfCBSRUdfU0VDVE9SX05VTUJFUiB8CgkJICBSRUdfQ1lMSU5ERVJfTE9XIHwgUkVHX0NZTElOREVSX0hJR0ggfAoJCSAgUkVHX0RFVklDRV9IRUFEICB8IFJFR19DT01NQU5EOwoJCWF0YUNkYi0+d3JpdGUuU2VjdG9yQ291bnRCeXRlID0gKHVuc2lnbmVkIGNoYXIpYmxvY2tDb3VudDsKCQlhdGFDZGItPndyaXRlLlNlY3Rvck51bWJlckJ5dGUgPSBzZWN0bnVtOwoJCWF0YUNkYi0+d3JpdGUuQ3lsaW5kZXJIaWdoQnl0ZSA9ICh1bnNpZ25lZCBjaGFyKShjeWxpbmRlcj4+OCk7CgkJYXRhQ2RiLT53cml0ZS5DeWxpbmRlckxvd0J5dGUgPSAodW5zaWduZWQgY2hhciljeWxpbmRlcjsKCQlhdGFDZGItPndyaXRlLkRldmljZUhlYWRCeXRlID0gKGhlYWQgfCBBVEFfQUREUkVTU19ERVZIRUFEX1NURCk7CgkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DTURfUElPX1JFQUQ7CgkJYnJlYWs7CgoJY2FzZSBXUklURV8xMDoKCQlVU19ERUJVR1AoIiAgIEFUQSBPVVQgLSBTQ1NJT1BfV1JJVEVcbiIpOwoKCQlsYmEgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKSZzcmItPmNtbmRbMl0pOwoJCWJsb2NrQ291bnQgPSAodW5zaWduZWQgbG9uZylzcmItPmNtbmRbN108PDggfCAodW5zaWduZWQgbG9uZylzcmItPmNtbmRbOF07CgoJCWlmIChhdGFfaWRfaGFzX2xiYShpZCkpIHsKCQkJc2VjdG51bSA9ICh1bnNpZ25lZCBjaGFyKShsYmEpOwoJCQljeWxpbmRlciA9ICh1bnNpZ25lZCBzaG9ydCkobGJhPj44KTsKCQkJaGVhZCA9IEFUQV9BRERSRVNTX0RFVkhFQURfTEJBX01PREUgfCAodW5zaWduZWQgY2hhcikobGJhPj4yNCAmIDB4MEYpOwoJCX0gZWxzZSB7CgkJCXNlY3RudW0gPSAodTgpKChsYmEgJSBpZFtBVEFfSURfU0VDVE9SU10pICsgMSk7CgkJCWN5bGluZGVyID0gKHUxNikobGJhIC8gKGlkW0FUQV9JRF9TRUNUT1JTXSAqCgkJCQkJaWRbQVRBX0lEX0hFQURTXSkpOwoJCQloZWFkID0gKHU4KSgobGJhIC8gaWRbQVRBX0lEX1NFQ1RPUlNdKSAlCgkJCQkJaWRbQVRBX0lEX0hFQURTXSk7CgkJfQoJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMCA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kOwoJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCWF0YUNkYi0+Z2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDE7CgkJYXRhQ2RiLT5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0KCQkgIFJFR19TRUNUT1JfQ09VTlQgfCBSRUdfU0VDVE9SX05VTUJFUiB8CgkJICBSRUdfQ1lMSU5ERVJfTE9XIHwgUkVHX0NZTElOREVSX0hJR0ggfAoJCSAgUkVHX0RFVklDRV9IRUFEICB8IFJFR19DT01NQU5EOwoJCWF0YUNkYi0+d3JpdGUuU2VjdG9yQ291bnRCeXRlID0gKHVuc2lnbmVkIGNoYXIpYmxvY2tDb3VudDsKCQlhdGFDZGItPndyaXRlLlNlY3Rvck51bWJlckJ5dGUgPSBzZWN0bnVtOwoJCWF0YUNkYi0+d3JpdGUuQ3lsaW5kZXJIaWdoQnl0ZSA9ICh1bnNpZ25lZCBjaGFyKShjeWxpbmRlcj4+OCk7CgkJYXRhQ2RiLT53cml0ZS5DeWxpbmRlckxvd0J5dGUgPSAodW5zaWduZWQgY2hhciljeWxpbmRlcjsKCQlhdGFDZGItPndyaXRlLkRldmljZUhlYWRCeXRlID0gKGhlYWQgfCBBVEFfQUREUkVTU19ERVZIRUFEX1NURCk7CgkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IEFUQV9DTURfUElPX1dSSVRFOwoJCWJyZWFrOwoKCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6CgkJVVNfREVCVUdQKCIgICBBVEEgT1VUIC0gU0NTSU9QX01FRElVTV9SRU1PVkFMXG4iKTsKCgkJaWYgKGluZm8tPkRldmljZUZsYWdzICYgREZfUkVNT1ZBQkxFX01FRElBKSB7CgkJCVVTX0RFQlVHUCgiICAgc3JiLT5jbW5kWzRdID0gMHglWFxuIiwgc3JiLT5jbW5kWzRdKTsKCSAgICAKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUwID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNYWpvckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMSA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWlub3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuVHJhbnNmZXJCbG9ja1NpemUgPSAxOwoJCQlhdGFDZGItPmdlbmVyaWMuUmVnaXN0ZXJTZWxlY3QgPSBSRUdfQ09NTUFORDsKCQkJYXRhQ2RiLT53cml0ZS5Db21tYW5kQnl0ZSA9IChzcmItPmNtbmRbNF0gJiAweDEpID8KCQkJCUFUQV9DTURfTUVESUFfTE9DSyA6IEFUQV9DTURfTUVESUFfVU5MT0NLOwoJCQlpc2QyMDBfc3JiX3NldF9idWZmbGVuKHNyYiwgMCk7CgkJfSBlbHNlIHsKCQkJVVNfREVCVUdQKCIgICBOb3QgcmVtb3ZlYWJsZSBtZWRpYSwganVzdCByZXBvcnQgb2theVxuIik7CgkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQkJc2VuZFRvVHJhbnNwb3J0ID0gMDsKCQl9CgkJYnJlYWs7CgoJY2FzZSBTVEFSVF9TVE9QOiAgICAKCQlVU19ERUJVR1AoIiAgIEFUQSBPVVQgLSBTQ1NJT1BfU1RBUlRfU1RPUF9VTklUXG4iKTsKCQlVU19ERUJVR1AoIiAgIHNyYi0+Y21uZFs0XSA9IDB4JVhcbiIsIHNyYi0+Y21uZFs0XSk7CgoJCWlmICgoc3JiLT5jbW5kWzRdICYgMHgzKSA9PSAweDIpIHsKCQkJVVNfREVCVUdQKCIgICBNZWRpYSBFamVjdFxuIik7CgkJCWF0YUNkYi0+Z2VuZXJpYy5TaWduYXR1cmVCeXRlMCA9IGluZm8tPkNvbmZpZ0RhdGEuQVRBTWFqb3JDb21tYW5kOwoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTEgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1pbm9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlRyYW5zZmVyQmxvY2tTaXplID0gMDsKCQkJYXRhQ2RiLT5nZW5lcmljLlJlZ2lzdGVyU2VsZWN0ID0gUkVHX0NPTU1BTkQ7CgkJCWF0YUNkYi0+d3JpdGUuQ29tbWFuZEJ5dGUgPSBBVEFfQ09NTUFORF9NRURJQV9FSkVDVDsKCQl9IGVsc2UgaWYgKChzcmItPmNtbmRbNF0gJiAweDMpID09IDB4MSkgewoJCQlVU19ERUJVR1AoIiAgIEdldCBNZWRpYSBTdGF0dXNcbiIpOwoJCQlhdGFDZGItPmdlbmVyaWMuU2lnbmF0dXJlQnl0ZTAgPSBpbmZvLT5Db25maWdEYXRhLkFUQU1ham9yQ29tbWFuZDsKCQkJYXRhQ2RiLT5nZW5lcmljLlNpZ25hdHVyZUJ5dGUxID0gaW5mby0+Q29uZmlnRGF0YS5BVEFNaW5vckNvbW1hbmQ7CgkJCWF0YUNkYi0+Z2VuZXJpYy5UcmFuc2ZlckJsb2NrU2l6ZSA9IDE7CgkJCWF0YUNkYi0+Z2VuZXJpYy5SZWdpc3RlclNlbGVjdCA9IFJFR19DT01NQU5EOwoJCQlhdGFDZGItPndyaXRlLkNvbW1hbmRCeXRlID0gQVRBX0NPTU1BTkRfR0VUX01FRElBX1NUQVRVUzsKCQkJaXNkMjAwX3NyYl9zZXRfYnVmZmxlbihzcmIsIDApOwoJCX0gZWxzZSB7CgkJCVVTX0RFQlVHUCgiICAgTm90aGluZyB0byBkbywganVzdCByZXBvcnQgb2theVxuIik7CgkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKCQkJc2VuZFRvVHJhbnNwb3J0ID0gMDsKCQl9CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlVU19ERUJVR1AoIlVuc3VwcG9ydGVkIFNDU0kgY29tbWFuZCAtIDB4JVhcbiIsIHNyYi0+Y21uZFswXSk7CgkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CgkJc2VuZFRvVHJhbnNwb3J0ID0gMDsKCQlicmVhazsKCX0KCglyZXR1cm4oc2VuZFRvVHJhbnNwb3J0KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpc2QyMDBfZnJlZV9pbmZvCiAqCiAqIEZyZWVzIHRoZSBkcml2ZXIgc3RydWN0dXJlLgogKi8Kc3RhdGljIHZvaWQgaXNkMjAwX2ZyZWVfaW5mb19wdHJzKHZvaWQgKmluZm9fKQp7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm8gPSAoc3RydWN0IGlzZDIwMF9pbmZvICopIGluZm9fOwoKCWlmIChpbmZvKSB7CgkJa2ZyZWUoaW5mby0+aWQpOwoJCWtmcmVlKGluZm8tPlJlZ3NCdWYpOwoJCWtmcmVlKGluZm8tPnNyYi5zZW5zZV9idWZmZXIpOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaXNkMjAwX2luaXRfaW5mbwogKgkJCQkJCQkJCSAKICogQWxsb2NhdGVzIChpZiBuZWNlc3NhcnkpIGFuZCBpbml0aWFsaXplcyB0aGUgZHJpdmVyIHN0cnVjdHVyZS4KICoKICogUkVUVVJOUzoKICogICAgSVNEIHN0YXR1cyBjb2RlCiAqLwpzdGF0aWMgaW50IGlzZDIwMF9pbml0X2luZm8oc3RydWN0IHVzX2RhdGEgKnVzKQp7CglpbnQgcmV0U3RhdHVzID0gSVNEMjAwX0dPT0Q7CglzdHJ1Y3QgaXNkMjAwX2luZm8gKmluZm87CgoJaW5mbyA9IChzdHJ1Y3QgaXNkMjAwX2luZm8gKikKCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGlzZDIwMF9pbmZvKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWluZm8pCgkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJZWxzZSB7CgkJaW5mby0+aWQgPSBremFsbG9jKEFUQV9JRF9XT1JEUyAqIDIsIEdGUF9LRVJORUwpOwoJCWluZm8tPlJlZ3NCdWYgPSAodW5zaWduZWQgY2hhciAqKQoJCQkJa21hbGxvYyhzaXplb2YoaW5mby0+QVRBUmVncyksIEdGUF9LRVJORUwpOwoJCWluZm8tPnNyYi5zZW5zZV9idWZmZXIgPQoJCQkJa21hbGxvYyhTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIEdGUF9LRVJORUwpOwoJCWlmICghaW5mby0+aWQgfHwgIWluZm8tPlJlZ3NCdWYgfHwgIWluZm8tPnNyYi5zZW5zZV9idWZmZXIpIHsKCQkJaXNkMjAwX2ZyZWVfaW5mb19wdHJzKGluZm8pOwoJCQlrZnJlZShpbmZvKTsKCQkJcmV0U3RhdHVzID0gSVNEMjAwX0VSUk9SOwoJCX0KCX0KCglpZiAocmV0U3RhdHVzID09IElTRDIwMF9HT09EKSB7CgkJdXMtPmV4dHJhID0gaW5mbzsKCQl1cy0+ZXh0cmFfZGVzdHJ1Y3RvciA9IGlzZDIwMF9mcmVlX2luZm9fcHRyczsKCX0gZWxzZQoJCVVTX0RFQlVHUCgiRVJST1IgLSBrbWFsbG9jIGZhaWx1cmVcbiIpOwoKCXJldHVybiByZXRTdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbml0aWFsaXphdGlvbiBmb3IgdGhlIElTRDIwMCAKICovCgpzdGF0aWMgaW50IGlzZDIwMF9Jbml0aWFsaXphdGlvbihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCVVTX0RFQlVHUCgiSVNEMjAwIEluaXRpYWxpemF0aW9uLi4uXG4iKTsKCgkvKiBJbml0aWFsaXplIElTRDIwMCBpbmZvIHN0cnVjdCAqLwoKCWlmIChpc2QyMDBfaW5pdF9pbmZvKHVzKSA9PSBJU0QyMDBfRVJST1IpIHsKCQlVU19ERUJVR1AoIkVSUk9SIEluaXRpYWxpemluZyBJU0QyMDAgSW5mbyBzdHJ1Y3RcbiIpOwoJfSBlbHNlIHsKCQkvKiBHZXQgZGV2aWNlIHNwZWNpZmljIGRhdGEgKi8KCgkJaWYgKGlzZDIwMF9nZXRfaW5xdWlyeV9kYXRhKHVzKSAhPSBJU0QyMDBfR09PRCkKCQkJVVNfREVCVUdQKCJJU0QyMDAgSW5pdGlhbGl6YXRpb24gRmFpbHVyZVxuIik7CgkJZWxzZQoJCQlVU19ERUJVR1AoIklTRDIwMCBJbml0aWFsaXphdGlvbiBjb21wbGV0ZVxuIik7Cgl9CgoJcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUHJvdG9jb2wgYW5kIFRyYW5zcG9ydCBmb3IgdGhlIElTRDIwMCBBU0lDCiAqCiAqIFRoaXMgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBhcmUgZm9yIEFUQSBkZXZpY2VzIGNvbm5lY3RlZCB0byBhbiBJU0QyMDAKICogQVNJQy4gIEFuIEFUQVBJIGRldmljZSB0aGF0IGlzIGNvbmVjdGVkIGFzIGEgc2xhdmUgZGV2aWNlIHdpbGwgYmUKICogZGV0ZWN0ZWQgaW4gdGhlIGRyaXZlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBhbmQgdGhlIHByb3RvY29sIHdpbGwKICogYmUgY2hhbmdlZCB0byBhbiBBVEFQSSBwcm90b2NvbCAoVHJhbnNwYXJlbnQgU0NTSSkuCiAqCiAqLwoKc3RhdGljIHZvaWQgaXNkMjAwX2F0YV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQp7CglpbnQgc2VuZFRvVHJhbnNwb3J0ID0gMSwgb3JpZ19idWZmbGVuOwoJdW5pb24gYXRhX2NkYiBhdGFDZGI7CgoJLyogTWFrZSBzdXJlIGRyaXZlciB3YXMgaW5pdGlhbGl6ZWQgKi8KCglpZiAodXMtPmV4dHJhID09IE5VTEwpCgkJVVNfREVCVUdQKCJFUlJPUiBEcml2ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKCglzY3NpX3NldF9yZXNpZChzcmIsIDApOwoJLyogc2NzaV9idWZmbGVuIG1pZ2h0IGNoYW5nZSBpbiBwcm90b2NvbCB0cmFuc2xhdGlvbiB0byBhdGEgKi8KCW9yaWdfYnVmZmxlbiA9IHNjc2lfYnVmZmxlbihzcmIpOwoJc2VuZFRvVHJhbnNwb3J0ID0gaXNkMjAwX3Njc2lfdG9fYXRhKHNyYiwgdXMsICZhdGFDZGIpOwoKCS8qIHNlbmQgdGhlIGNvbW1hbmQgdG8gdGhlIHRyYW5zcG9ydCBsYXllciAqLwoJaWYgKHNlbmRUb1RyYW5zcG9ydCkKCQlpc2QyMDBfaW52b2tlX3RyYW5zcG9ydCh1cywgc3JiLCAmYXRhQ2RiKTsKCglpc2QyMDBfc3JiX3NldF9idWZmbGVuKHNyYiwgb3JpZ19idWZmbGVuKTsKfQoKc3RhdGljIGludCBpc2QyMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCgkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCnsKCXN0cnVjdCB1c19kYXRhICp1czsKCWludCByZXN1bHQ7CgoJcmVzdWx0ID0gdXNiX3N0b3JfcHJvYmUxKCZ1cywgaW50ZiwgaWQsCgkJCShpZCAtIGlzZDIwMF91c2JfaWRzKSArIGlzZDIwMF91bnVzdWFsX2Rldl9saXN0KTsKCWlmIChyZXN1bHQpCgkJcmV0dXJuIHJlc3VsdDsKCgl1cy0+cHJvdG9jb2xfbmFtZSA9ICJJU0QyMDAgQVRBL0FUQVBJIjsKCXVzLT5wcm90b19oYW5kbGVyID0gaXNkMjAwX2F0YV9jb21tYW5kOwoKCXJlc3VsdCA9IHVzYl9zdG9yX3Byb2JlMih1cyk7CglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXNkMjAwX2RyaXZlciA9IHsKCS5uYW1lID0JCSJ1bXMtaXNkMjAwIiwKCS5wcm9iZSA9CWlzZDIwMF9wcm9iZSwKCS5kaXNjb25uZWN0ID0JdXNiX3N0b3JfZGlzY29ubmVjdCwKCS5zdXNwZW5kID0JdXNiX3N0b3Jfc3VzcGVuZCwKCS5yZXN1bWUgPQl1c2Jfc3Rvcl9yZXN1bWUsCgkucmVzZXRfcmVzdW1lID0JdXNiX3N0b3JfcmVzZXRfcmVzdW1lLAoJLnByZV9yZXNldCA9CXVzYl9zdG9yX3ByZV9yZXNldCwKCS5wb3N0X3Jlc2V0ID0JdXNiX3N0b3JfcG9zdF9yZXNldCwKCS5pZF90YWJsZSA9CWlzZDIwMF91c2JfaWRzLAoJLnNvZnRfdW5iaW5kID0JMSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGlzZDIwMF9pbml0KHZvaWQpCnsKCXJldHVybiB1c2JfcmVnaXN0ZXIoJmlzZDIwMF9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgaXNkMjAwX2V4aXQodm9pZCkKewoJdXNiX2RlcmVnaXN0ZXIoJmlzZDIwMF9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChpc2QyMDBfaW5pdCk7Cm1vZHVsZV9leGl0KGlzZDIwMF9leGl0KTsK