LyoKICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvYWNwaS5oPgojaW5jbHVkZSA8bGludXgvZG1pLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgoKI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgoKI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX1ZFUlNJT04oU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOwoKc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwoKc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGZua2V5aW5pdCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCgkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOwoKc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhjYW1lcmEsCgkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKCnN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAoJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cm1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWFzaywKCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKCnN0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOwptb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModXNlaW5wdXQsCgkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwoKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxCTEKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzCTMKCi8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgojZGVmaW5lIFNPTllQSV9UWVBFMV9CQVNFCQkweDUwCiNkZWZpbmUgU09OWVBJX0cxMEEJCQkoU09OWVBJX1RZUEUxX0JBU0UrMHgxNCkKI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAojZGVmaW5lIFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUCTB4MDQKCi8qIHR5cGUyIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfU0lSUQkJCTB4OWIKI2RlZmluZSBTT05ZUElfU0xPQgkJCTB4OWMKI2RlZmluZSBTT05ZUElfU0hJQgkJCTB4OWQKI2RlZmluZSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkUJMHgyMAojZGVmaW5lIFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUCTB4MTIKCi8qIHR5cGUzIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfVFlQRTNfQkFTRQkJMHg0MAojZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19NSVNDCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg2ZCkgLyogOCBiaXRzICAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19SRUdJT05fU0laRQkweDIwCiNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgoKLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgYWRkcmVzc2VzICovCiNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CiNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAojZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgojZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CiNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCiNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYwojZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CiNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCgovKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KI2RlZmluZSBTT05ZUElfRkFOMF9TVEFUVVMJMHg5MwojZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCgovKiBpb3BvcnRzIHVzZWQgZm9yIGJyaWdodG5lc3MgYW5kIHR5cGUyIGV2ZW50cyAqLwojZGVmaW5lIFNPTllQSV9EQVRBX0lPUE9SVAkweDYyCiNkZWZpbmUgU09OWVBJX0NTVF9JT1BPUlQJMHg2NgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpb3BvcnRzICovCnN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgewoJdTE2CXBvcnQxOwoJdTE2CXBvcnQyOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3Qgc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0W10gPSB7Cgl7IDB4MTBjMCwgMHgxMGM0IH0sCS8qIGxvb2tzIGxpa2UgdGhlIGRlZmF1bHQgb24gQzFWeCAqLwoJeyAweDEwODAsIDB4MTA4NCB9LAoJeyAweDEwOTAsIDB4MTA5NCB9LAoJeyAweDEwYTAsIDB4MTBhNCB9LAoJeyAweDEwYjAsIDB4MTBiNCB9LAoJeyAweDAsIDB4MCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3RbXSA9IHsKCXsgMHgxMDgwLCAweDEwODQgfSwKCXsgMHgxMGEwLCAweDEwYTQgfSwKCXsgMHgxMGMwLCAweDEwYzQgfSwKCXsgMHgxMGUwLCAweDEwZTQgfSwKCXsgMHgwLCAweDAgfQp9OwoKLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICpzb255cGlfdHlwZTNfaW9wb3J0X2xpc3QgPQoJc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpbnRlcnJ1cHRzICovCnN0cnVjdCBzb255cGlfaXJxX2xpc3QgewoJdTE2CWlycTsKCXUxNgliaXRzOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUxX2lycV9saXN0W10gPSB7Cgl7IDExLCAweDIgfSwJLyogSVJRIDExLCBHTzIyPTAsR08yMz0xIGluIEFNTCAqLwoJeyAxMCwgMHgxIH0sCS8qIElSUSAxMCwgR08yMj0xLEdPMjM9MCBpbiBBTUwgKi8KCXsgIDUsIDB4MCB9LAkvKiBJUlEgIDUsIEdPMjI9MCxHTzIzPTAgaW4gQU1MICovCgl7ICAwLCAweDMgfQkvKiBubyBJUlEsIEdPMjI9MSxHTzIzPTEgaW4gQU1MICovCn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCBzb255cGlfdHlwZTJfaXJxX2xpc3RbXSA9IHsKCXsgMTEsIDB4ODAgfSwJLyogSVJRIDExLCAweDgwIGluIFNJUlEgaW4gQU1MICovCgl7IDEwLCAweDQwIH0sCS8qIElSUSAxMCwgMHg0MCBpbiBTSVJRIGluIEFNTCAqLwoJeyAgOSwgMHgyMCB9LAkvKiBJUlEgIDksIDB4MjAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgIDYsIDB4MTAgfSwJLyogSVJRICA2LCAweDEwIGluIFNJUlEgaW4gQU1MICovCgl7ICAwLCAweDAwIH0JLyogbm8gSVJRLCAweDAwIGluIFNJUlEgaW4gQU1MICovCn07CgovKiBzYW1lIGFzIGluIHR5cGUyIG1vZGVscyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQojZGVmaW5lIFNPTllQSV9DQU1FUkFfSFVFCQkJMgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJCTUKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QwojZGVmaW5lIFNPTllQSV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9NQVNLCTB4MwojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKCi8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0NfTUFTSwkJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRET1dOX1JFUVVFU1QJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTIAkJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKCiNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9SRVZJU0lPTiAJCQk4CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQoKLyogRXZlbnQgbWFza3MgKi8KI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCiNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKI2RlZmluZSBTT05ZUElfRk5LRVlfTUFTSwkJCTB4MDAwMDAwMDQKI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4CiNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKI2RlZmluZSBTT05ZUElfQkFDS19NQVNLCQkJMHgwMDAwMDAyMAojZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCiNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKI2RlZmluZSBTT05ZUElfWk9PTV9NQVNLCQkJMHgwMDAwMDEwMAojZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAojZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCiNkZWZpbmUgU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCQkweDAwMDAwODAwCiNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKI2RlZmluZSBTT05ZUElfV0lSRUxFU1NfTUFTSwkJCTB4MDAwMDIwMDAKCnN0cnVjdCBzb255cGlfZXZlbnQgewoJdTgJZGF0YTsKCXU4CWV2ZW50Owp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3JlbGVhc2VldltdID0gewoJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfam9nZ2VyZXZbXSA9IHsKCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAoJeyAweDVmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEIH0sCgl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAoJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCgl7IDB4MDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiB9LAoJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKCXsgMHgxZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgfSwKCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAoJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCgl7IDB4NDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCB9LAoJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewoJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAoJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCgl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0gewoJeyAweDEwLCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDIH0sCgl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAoJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKCXsgMHgxMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YzIH0sCgl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAoJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKCXsgMHgxNiwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2IH0sCgl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAoJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKCXsgMHgxOSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5IH0sCgl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAoJeyAweDFjLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEyIH0sCgl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAoJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAoJeyAweDIyLCBTT05ZUElfRVZFTlRfRk5LRVlfMiB9LAoJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAoJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAoJeyAweDMzLCBTT05ZUElfRVZFTlRfRk5LRVlfRiB9LAoJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAoJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAoJeyAweDM2LCBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKCXsgMHgwMSwgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKCXsgMHg1YywgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JsdWVldltdID0gewoJeyAweDU1LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgfSwKCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7Cgl7IDB4NTksIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhY2tldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2hlbHBldltdID0gewoJeyAweDNiLCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbGlkIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbGlkZXZbXSA9IHsKCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKCXsgMHg1MCwgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKCXsgMHgzOSwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgdGh1bWJwaHJhc2UgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7Cgl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtb3Rpb25leWUgY2FtZXJhIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7Cgl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0gewoJeyAweDUzLCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUIH0sCgl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhdHRlcnlldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCgl7IDAsIDAgfQp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB7CglpbnQJCQltb2RlbDsKCXU4CQkJZGF0YTsKCXVuc2lnbmVkIGxvbmcJCW1hc2s7CglzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOwp9IHNvbnlwaV9ldmVudHR5cGVzW10gPSB7Cgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg3MCwgU09OWVBJX01FWUVfTUFTSywgc29ueXBpX21leWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MTAsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MDgsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIxLCBTT05ZUElfWk9PTV9NQVNLLCBzb255cGlfem9vbWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjAsIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLLCBzb255cGlfdGh1bWJwaHJhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCgoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDMxLCBTT05ZUElfV0lSRUxFU1NfTUFTSywgc29ueXBpX3dsZXNzZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyAwIH0KfTsKCiNkZWZpbmUgU09OWVBJX0JVRl9TSVpFCTEyOAoKLyogVGhlIG5hbWUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBpbnB1dCBkZXZpY2UgZHJpdmVycyAqLwojZGVmaW5lIFNPTllQSV9KT0dfSU5QVVROQU1FCSJTb255IFZhaW8gSm9nZGlhbCIKI2RlZmluZSBTT05ZUElfS0VZX0lOUFVUTkFNRQkiU29ueSBWYWlvIEtleXMiCgovKiBDb3JyZXNwb25kYW5jZSB0YWJsZSBiZXR3ZWVuIHNvbnlwaSBldmVudHMgYW5kIGlucHV0IGxheWVyIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHsKCWludCBzb255cGlldjsKCWludCBpbnB1dGV2Owp9IHNvbnlwaV9pbnB1dGtleXNbXSA9IHsKCXsgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCwJIAlLRVlfQ0FNRVJBIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9PTkxZLCAJCUtFWV9GTiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRVNDLCAJCUtFWV9GTl9FU0MgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxLCAJCUtFWV9GTl9GMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjIsIAkJS0VZX0ZOX0YyIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMywgCQlLRVlfRk5fRjMgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0LCAJCUtFWV9GTl9GNCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjUsIAkJS0VZX0ZOX0Y1IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNiwgCQlLRVlfRk5fRjYgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3LCAJCUtFWV9GTl9GNyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjgsIAkJS0VZX0ZOX0Y4IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GOSwJCUtFWV9GTl9GOSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEwLAkJS0VZX0ZOX0YxMCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjExLCAJCUtFWV9GTl9GMTEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiwJCUtFWV9GTl9GMTIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZXzEsIAkJS0VZX0ZOXzEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZXzIsIAkJS0VZX0ZOXzIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0QsCQkJS0VZX0ZOX0QgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0UsCQkJS0VZX0ZOX0UgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YsCQkJS0VZX0ZOX0YgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX1MsCQkJS0VZX0ZOX1MgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0IsCQkJS0VZX0ZOX0IgfSwKCXsgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VELCAJS0VZX0JMVUUgfSwKCXsgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiwgCQlLRVlfQkxVRSB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMSwgCQlLRVlfUFJPRzEgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDIsIAkJS0VZX1BST0cyIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AzLCAJCUtFWV9QUk9HMyB9LAoJeyBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VELCAJCUtFWV9CQUNLIH0sCgl7IFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQsIAkJS0VZX0hFTFAgfSwKCXsgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCwgCQlLRVlfWk9PTSB9LAoJeyBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCwgCUJUTl9USFVNQiB9LAoJeyAwLCAwIH0sCn07CgpzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIHsKCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKCWludCBrZXk7Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9kZXZpY2UgewoJc3RydWN0IHBjaV9kZXYgKmRldjsKCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cgl1MTYgaXJxOwoJdTE2IGJpdHM7Cgl1MTYgaW9wb3J0MTsKCXUxNiBpb3BvcnQyOwoJdTE2IHJlZ2lvbl9zaXplOwoJdTE2IGV2dHlwZV9vZmZzZXQ7CglpbnQgY2FtZXJhX3Bvd2VyOwoJaW50IGJsdWV0b290aF9wb3dlcjsKCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKCXN0cnVjdCBrZmlmbyAqZmlmbzsKCXNwaW5sb2NrX3QgZmlmb19sb2NrOwoJd2FpdF9xdWV1ZV9oZWFkX3QgZmlmb19wcm9jX2xpc3Q7CglzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmlmb19hc3luYzsKCWludCBvcGVuX2NvdW50OwoJaW50IG1vZGVsOwoJc3RydWN0IGlucHV0X2RldiBpbnB1dF9qb2dfZGV2OwoJc3RydWN0IGlucHV0X2RldiBpbnB1dF9rZXlfZGV2OwoJc3RydWN0IHdvcmtfc3RydWN0IGlucHV0X3dvcms7CglzdHJ1Y3Qga2ZpZm8gKmlucHV0X2ZpZm87CglzcGlubG9ja190IGlucHV0X2ZpZm9fbG9jazsKfSBzb255cGlfZGV2aWNlOwoKI2RlZmluZSBJVEVSQVRJT05TX0xPTkcJCTEwMDAwCiNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAoKI2RlZmluZSB3YWl0X29uX2NvbW1hbmQocXVpZXQsIGNvbW1hbmQsIGl0ZXJhdGlvbnMpIHsgXAoJdW5zaWduZWQgaW50IG4gPSBpdGVyYXRpb25zOyBcCgl3aGlsZSAoLS1uICYmIChjb21tYW5kKSkgXAoJCXVkZWxheSgxKTsgXAoJaWYgKCFuICYmICh2ZXJib3NlIHx8ICFxdWlldCkpIFwKCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb255cGkgY29tbWFuZCBmYWlsZWQgYXQgJXMgOiAlcyAobGluZSAlZClcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAp9CgojaWZkZWYgQ09ORklHX0FDUEkKI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgKCFhY3BpX2Rpc2FibGVkKQojZWxzZQojZGVmaW5lIFNPTllQSV9BQ1BJX0FDVElWRSAwCiNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwoKc3RhdGljIGludCBzb255cGlfZWNfd3JpdGUodTggYWRkciwgdTggdmFsdWUpCnsKI2lmZGVmIENPTkZJR19BQ1BJX0VDCglpZiAoU09OWVBJX0FDUElfQUNUSVZFKQoJCXJldHVybiBlY193cml0ZShhZGRyLCB2YWx1ZSk7CiNlbmRpZgoJd2FpdF9vbl9jb21tYW5kKDEsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDMsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoMHg4MSwgU09OWVBJX0NTVF9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoYWRkciwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKHZhbHVlLCBTT05ZUElfREFUQV9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfZWNfcmVhZCh1OCBhZGRyLCB1OCAqdmFsdWUpCnsKI2lmZGVmIENPTkZJR19BQ1BJX0VDCglpZiAoU09OWVBJX0FDUElfQUNUSVZFKQoJCXJldHVybiBlY19yZWFkKGFkZHIsIHZhbHVlKTsKI2VuZGlmCgl3YWl0X29uX2NvbW1hbmQoMSwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMywgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcCgweDgwLCBTT05ZUElfQ1NUX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcChhZGRyLCBTT05ZUElfREFUQV9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CgkqdmFsdWUgPSBpbmJfcChTT05ZUElfREFUQV9JT1BPUlQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgZWNfcmVhZDE2KHU4IGFkZHIsIHUxNiAqdmFsdWUpCnsKCXU4IHZhbF9sYiwgdmFsX2hiOwoJaWYgKHNvbnlwaV9lY19yZWFkKGFkZHIsICZ2YWxfbGIpKQoJCXJldHVybiAtMTsKCWlmIChzb255cGlfZWNfcmVhZChhZGRyICsgMSwgJnZhbF9oYikpCgkJcmV0dXJuIC0xOwoJKnZhbHVlID0gdmFsX2xiIHwgKHZhbF9oYiA8PCA4KTsKCXJldHVybiAwOwp9CgovKiBJbml0aWFsaXplcyB0aGUgZGV2aWNlIC0gdGhpcyBjb21lcyBmcm9tIHRoZSBBTUwgY29kZSBpbiB0aGUgQUNQSSBiaW9zICovCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9zcnModm9pZCkKewoJdTMyIHY7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRkZGMDAwMCkgfCAoKHUzMikgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKCglwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7Cgl2ID0gKHYgJiAweEZGRjBGRkZGKSB8CgkgICAgKCgodTMyKSBzb255cGlfZGV2aWNlLmlvcG9ydDEgXiBzb255cGlfZGV2aWNlLmlvcG9ydDIpIDw8IDE2KTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCB2KTsKCgl2ID0gaW5sKFNPTllQSV9JUlFfUE9SVCk7Cgl2ICY9IH4oKCh1MzIpIDB4MykgPDwgU09OWVBJX0lSUV9TSElGVCk7Cgl2IHw9ICgoKHUzMikgc29ueXBpX2RldmljZS5iaXRzKSA8PCBTT05ZUElfSVJRX1NISUZUKTsKCW91dGwodiwgU09OWVBJX0lSUV9QT1JUKTsKCglwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7Cgl2ID0gKHYgJiAweEZGMUZGRkZGKSB8IDB4MDBDMDAwMDA7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMl9zcnModm9pZCkKewoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0hJQiwgKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkYwMCkgPj4gOCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NMT0IsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4MDBGRikpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NJUlEsIHNvbnlwaV9kZXZpY2UuYml0cykpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCXVkZWxheSgxMCk7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19zcnModm9pZCkKewoJdTE2IHYxNjsKCXU4ICB2ODsKCgkvKiBUaGlzIG1vZGVsIHR5cGUgdXNlcyB0aGUgc2FtZSBpbml0aWFsaWF6YXRpb24gb2YKCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGFzIHRoZSB0eXBlMiBtb2RlbHMuICovCglzb255cGlfdHlwZTJfc3JzKCk7CgoJLyogSW5pdGlhbGl6YXRpb24gb2YgUENJIGNvbmZpZyBzcGFjZSBvZiB0aGUgTFBDIGludGVyZmFjZSBicmlkZ2UuICovCgl2MTYgPSAoc29ueXBpX2RldmljZS5pb3BvcnQxICYgMHhGRkYwKSB8IDB4MDE7CglwY2lfd3JpdGVfY29uZmlnX3dvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9UWVBFM19HSUQyLCB2MTYpOwoJcGNpX3JlYWRfY29uZmlnX2J5dGUoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9UWVBFM19NSVNDLCAmdjgpOwoJdjggPSAodjggJiAweENGKSB8IDB4MTA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9UWVBFM19NSVNDLCB2OCk7Cn0KCi8qIERpc2FibGVzIHRoZSBkZXZpY2UgLSB0aGlzIGNvbWVzIGZyb20gdGhlIEFNTCBjb2RlIGluIHRoZSBBQ1BJIGJpb3MgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3R5cGUxX2Rpcyh2b2lkKQp7Cgl1MzIgdjsKCglwY2lfcmVhZF9jb25maWdfZHdvcmQoc29ueXBpX2RldmljZS5kZXYsIFNPTllQSV9HMTBBLCAmdik7Cgl2ID0gdiAmIDB4RkYzRkZGRkY7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOwoJdiB8PSAoMHgzIDw8IFNPTllQSV9JUlFfU0hJRlQpOwoJb3V0bCh2LCBTT05ZUElfSVJRX1BPUlQpOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfZGlzKHZvaWQpCnsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NISUIsIDApKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TTE9CLCAwKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0lSUSwgMCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKfQoKc3RhdGljIHZvaWQgc29ueXBpX3R5cGUzX2Rpcyh2b2lkKQp7Cglzb255cGlfdHlwZTJfZGlzKCk7Cgl1ZGVsYXkoMTApOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgMCk7Cn0KCnN0YXRpYyB1OCBzb255cGlfY2FsbDEodTggZGV2KQp7Cgl1OCB2MSwgdjI7CgoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0YihkZXYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7Cgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7Cgl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglyZXR1cm4gdjI7Cn0KCnN0YXRpYyB1OCBzb255cGlfY2FsbDIodTggZGV2LCB1OCBmbikKewoJdTggdjE7CgoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0YihkZXYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKGZuLCBzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcmV0dXJuIHYxOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwzKHU4IGRldiwgdTggZm4sIHU4IHYpCnsKCXU4IHYxOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIodiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXJldHVybiB2MTsKfQoKI2lmIDAKLyogR2V0IGJyaWdodG5lc3MsIGh1ZSBldGMuIFVucmVsaWFibGUuLi4gKi8Kc3RhdGljIHU4IHNvbnlwaV9yZWFkKHU4IGZuKQp7Cgl1OCB2MSwgdjI7CglpbnQgbiA9IDEwMDsKCgl3aGlsZSAobi0tKSB7CgkJdjEgPSBzb255cGlfY2FsbDIoMHg4ZiwgZm4pOwoJCXYyID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKCQlpZiAodjEgPT0gdjIgJiYgdjEgIT0gMHhmZikKCQkJcmV0dXJuIHYxOwoJfQoJcmV0dXJuIDB4ZmY7Cn0KI2VuZGlmCgovKiBTZXQgYnJpZ2h0bmVzcywgaHVlIGV0YyAqLwpzdGF0aWMgdm9pZCBzb255cGlfc2V0KHU4IGZuLCB1OCB2KQp7Cgl3YWl0X29uX2NvbW1hbmQoMCwgc29ueXBpX2NhbGwzKDB4OTAsIGZuLCB2KSwgSVRFUkFUSU9OU19TSE9SVCk7Cn0KCi8qIFRlc3RzIGlmIHRoZSBjYW1lcmEgaXMgcmVhZHkgKi8Kc3RhdGljIGludCBzb255cGlfY2FtZXJhX3JlYWR5KHZvaWQpCnsKCXU4IHY7CgoJdiA9IHNvbnlwaV9jYWxsMigweDhmLCBTT05ZUElfQ0FNRVJBX1NUQVRVUyk7CglyZXR1cm4gKHYgIT0gMHhmZiAmJiAodiAmIFNPTllQSV9DQU1FUkFfU1RBVFVTX1JFQURZKSk7Cn0KCi8qIFR1cm5zIHRoZSBjYW1lcmEgb2ZmICovCnN0YXRpYyB2b2lkIHNvbnlwaV9jYW1lcmFfb2ZmKHZvaWQpCnsKCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9QSUNUVVJFLCBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSyk7CgoJaWYgKCFzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKCQlyZXR1cm47CgoJc29ueXBpX2NhbGwyKDB4OTEsIDApOwoJc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIgPSAwOwp9CgovKiBUdXJucyB0aGUgY2FtZXJhIG9uICovCnN0YXRpYyB2b2lkIHNvbnlwaV9jYW1lcmFfb24odm9pZCkKewoJaW50IGksIGo7CgoJaWYgKHNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyKQoJCXJldHVybjsKCglmb3IgKGogPSA1OyBqID4gMDsgai0tKSB7CgoJCXdoaWxlIChzb255cGlfY2FsbDIoMHg5MSwgMHgxKSkKCQkJbXNsZWVwKDEwKTsKCQlzb255cGlfY2FsbDEoMHg5Myk7CgoJCWZvciAoaSA9IDQwMDsgaSA+IDA7IGktLSkgewoJCQlpZiAoc29ueXBpX2NhbWVyYV9yZWFkeSgpKQoJCQkJYnJlYWs7CgkJCW1zbGVlcCgxMCk7CgkJfQoJCWlmIChpKQoJCQlicmVhazsKCX0KCglpZiAoaiA9PSAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAic29ueXBpOiBmYWlsZWQgdG8gcG93ZXIgb24gY2FtZXJhXG4iKTsKCQlyZXR1cm47Cgl9CgoJc29ueXBpX3NldCgweDEwLCAweDVhKTsKCXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyID0gMTsKfQoKLyogc2V0cyB0aGUgYmx1ZXRvb3RoIHN1YnN5c3RlbSBwb3dlciBzdGF0ZSAqLwpzdGF0aWMgdm9pZCBzb255cGlfc2V0Ymx1ZXRvb3RocG93ZXIodTggc3RhdGUpCnsKCXN0YXRlID0gISFzdGF0ZTsKCglpZiAoc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPT0gc3RhdGUpCgkJcmV0dXJuOwoKCXNvbnlwaV9jYWxsMigweDk2LCBzdGF0ZSk7Cglzb255cGlfY2FsbDEoMHg4Mik7Cglzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlciA9IHN0YXRlOwp9CgpzdGF0aWMgdm9pZCBpbnB1dF9rZXlyZWxlYXNlKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBzb255cGlfa2V5cHJlc3Mga3A7CgoJd2hpbGUgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sICh1bnNpZ25lZCBjaGFyICopJmtwLAoJCQkgc2l6ZW9mKGtwKSkgPT0gc2l6ZW9mKGtwKSkgewoJCW1zbGVlcCgxMCk7CgkJaW5wdXRfcmVwb3J0X2tleShrcC5kZXYsIGtwLmtleSwgMCk7CgkJaW5wdXRfc3luYyhrcC5kZXYpOwoJfQp9CgpzdGF0aWMgdm9pZCBzb255cGlfcmVwb3J0X2lucHV0X2V2ZW50KHU4IGV2ZW50KQp7CglzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2ID0gJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXYgPSAmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2OwoJc3RydWN0IHNvbnlwaV9rZXlwcmVzcyBrcCA9IHsgTlVMTCB9OwoJaW50IGk7CgoJc3dpdGNoIChldmVudCkgewoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUDoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRDoKCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgMSk7CgkJaW5wdXRfc3luYyhqb2dfZGV2KTsKCQlicmVhazsKCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV046CgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRDoKCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgLTEpOwoJCWlucHV0X3N5bmMoam9nX2Rldik7CgkJYnJlYWs7CgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEOgoJCWtwLmtleSA9IEJUTl9NSURETEU7CgkJa3AuZGV2ID0gam9nX2RldjsKCQlicmVhazsKCgljYXNlIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRDoKCQkvKiBOb3RoaW5nLCBub3QgYWxsIFZBSU9zIGdlbmVyYXRlIHRoaXMgZXZlbnQgKi8KCQlicmVhazsKCglkZWZhdWx0OgoJCWZvciAoaSA9IDA7IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykKCQkJaWYgKGV2ZW50ID09IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXYpIHsKCQkJCWtwLmRldiA9IGtleV9kZXY7CgkJCQlrcC5rZXkgPSBzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXY7CgkJCQlicmVhazsKCQkJfQoJCWJyZWFrOwoJfQoKCWlmIChrcC5kZXYpIHsKCQlpbnB1dF9yZXBvcnRfa2V5KGtwLmRldiwga3Aua2V5LCAxKTsKCQlpbnB1dF9zeW5jKGtwLmRldik7CgkJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbywKCQkJICAodW5zaWduZWQgY2hhciAqKSZrcCwgc2l6ZW9mKGtwKSk7CgkJc2NoZWR1bGVfd29yaygmc29ueXBpX2RldmljZS5pbnB1dF93b3JrKTsKCX0KfQoKLyogSW50ZXJydXB0IGhhbmRsZXI6IHNvbWUgZXZlbnQgaXMgYXZhaWxhYmxlICovCnN0YXRpYyBpcnFyZXR1cm5fdCBzb255cGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKCXU4IHYxLCB2MiwgZXZlbnQgPSAwOwoJaW50IGksIGo7CgoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEgKyBzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQpOwoKCWZvciAoaSA9IDA7IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsOyBpKyspIHsKCQlpZiAoc29ueXBpX2RldmljZS5tb2RlbCAhPSBzb255cGlfZXZlbnR0eXBlc1tpXS5tb2RlbCkKCQkJY29udGludWU7CgkJaWYgKCh2MiAmIHNvbnlwaV9ldmVudHR5cGVzW2ldLmRhdGEpICE9CgkJICAgIHNvbnlwaV9ldmVudHR5cGVzW2ldLmRhdGEpCgkJCWNvbnRpbnVlOwoJCWlmICghKG1hc2sgJiBzb255cGlfZXZlbnR0eXBlc1tpXS5tYXNrKSkKCQkJY29udGludWU7CgkJZm9yIChqID0gMDsgc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OyBqKyspIHsKCQkJaWYgKHYxID09IHNvbnlwaV9ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5kYXRhKSB7CgkJCQlldmVudCA9IHNvbnlwaV9ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKCQkJCWdvdG8gZm91bmQ7CgkJCX0KCQl9Cgl9CgoJaWYgKHZlcmJvc2UpCgkJcHJpbnRrKEtFUk5fV0FSTklORwoJCSAgICAgICAic29ueXBpOiB1bmtub3duIGV2ZW50IHBvcnQxPTB4JTAyeCxwb3J0Mj0weCUwMnhcbiIsCgkJICAgICAgIHYxLCB2Mik7CgkvKiBXZSBuZWVkIHRvIHJldHVybiBJUlFfSEFORExFRCBoZXJlIGJlY2F1c2UgdGhlcmUgKmFyZSoKCSAqIGV2ZW50cyBiZWxvbmdpbmcgdG8gdGhlIHNvbnlwaSBkZXZpY2Ugd2UgZG9uJ3Qga25vdyBhYm91dCwKCSAqIGJ1dCB3ZSBzdGlsbCBkb24ndCB3YW50IHRob3NlIHRvIHBvbGx1dGUgdGhlIGxvZ3MuLi4gKi8KCXJldHVybiBJUlFfSEFORExFRDsKCmZvdW5kOgoJaWYgKHZlcmJvc2UgPiAxKQoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgInNvbnlwaTogZXZlbnQgcG9ydDE9MHglMDJ4LHBvcnQyPTB4JTAyeFxuIiwgdjEsIHYyKTsKCglpZiAodXNlaW5wdXQpCgkJc29ueXBpX3JlcG9ydF9pbnB1dF9ldmVudChldmVudCk7CgoJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuZmlmbywgKHVuc2lnbmVkIGNoYXIgKikmZXZlbnQsIHNpemVvZihldmVudCkpOwoJa2lsbF9mYXN5bmMoJnNvbnlwaV9kZXZpY2UuZmlmb19hc3luYywgU0lHSU8sIFBPTExfSU4pOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCi8qIEV4dGVybmFsIGNhbWVyYSBjb21tYW5kIChleHBvcnRlZCB0byB0aGUgbW90aW9uIGV5ZSB2NGwgZHJpdmVyKSAqLwppbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKewoJaWYgKCFjYW1lcmEpCgkJcmV0dXJuIC1FSU87CgoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCglzd2l0Y2ggKGNvbW1hbmQpIHsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBOgoJCWlmICh2YWx1ZSkKCQkJc29ueXBpX2NhbWVyYV9vbigpOwoJCWVsc2UKCQkJc29ueXBpX2NhbWVyYV9vZmYoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVDoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBSFVFOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1I6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkU6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQUdDOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHNvbnlwaV9jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKCQkgICAgICAgY29tbWFuZCk7CgkJYnJlYWs7Cgl9Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpFWFBPUlRfU1lNQk9MKHNvbnlwaV9jYW1lcmFfY29tbWFuZCk7CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCnsKCWludCByZXR2YWw7CgoJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZzb255cGlfZGV2aWNlLmZpZm9fYXN5bmMpOwoJaWYgKHJldHZhbCA8IDApCgkJcmV0dXJuIHJldHZhbDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXNvbnlwaV9taXNjX2Zhc3luYygtMSwgZmlsZSwgMCk7Cglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc29ueXBpX2RldmljZS5vcGVuX2NvdW50LS07Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CgkvKiBGbHVzaCBpbnB1dCBxdWV1ZSBvbiBmaXJzdCBvcGVuICovCglpZiAoIXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCkKCQlrZmlmb19yZXNldChzb255cGlfZGV2aWNlLmZpZm8pOwoJc29ueXBpX2RldmljZS5vcGVuX2NvdW50Kys7Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAoJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKewoJc3NpemVfdCByZXQ7Cgl1bnNpZ25lZCBjaGFyIGM7CgoJaWYgKChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSA9PSAwKSAmJgoJICAgIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCgkJcmV0dXJuIC1FQUdBSU47CgoJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QsCgkJCQkgICAgICAga2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgIT0gMCk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJd2hpbGUgKHJldCA8IGNvdW50ICYmCgkgICAgICAgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmZpZm8sICZjLCBzaXplb2YoYykpID09IHNpemVvZihjKSkpIHsKCQlpZiAocHV0X3VzZXIoYywgYnVmKyspKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlyZXQrKzsKCX0KCglpZiAocmV0ID4gMCkgewoJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKCQlpbm9kZS0+aV9hdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHVuc2lnbmVkIGludCBzb255cGlfbWlzY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQp7Cglwb2xsX3dhaXQoZmlsZSwgJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QsIHdhaXQpOwoJaWYgKGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pKQoJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX21pc2NfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLAoJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglpbnQgcmV0ID0gMDsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJdTggdmFsODsKCXUxNiB2YWwxNjsKCglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgU09OWVBJX0lPQ0dCUlQ6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9MQ0RfTElHSFQsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NCUlQ6CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9MQ0RfTElHSFQsIHZhbDgpKQoJCQlyZXQgPSAtRUlPOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDFDQVA6CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9GVUxMLCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMVJFTToKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0xFRlQsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQyQ0FQOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfRlVMTCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDJSRU06CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9MRUZULCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFURkxBR1M6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9CQVRfRkxBR1MsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJdmFsOCAmPSAweDA3OwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkxVRToKCQl2YWw4ID0gc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXI7CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NCTFVFOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHZhbDgpOwoJCWJyZWFrOwoJLyogRkFOIENvbnRyb2xzICovCgljYXNlIFNPTllQSV9JT0NHRkFOOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfRkFOMF9TVEFUVVMsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NGQU46CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9GQU4wX1NUQVRVUywgdmFsOCkpCgkJCXJldCA9IC1FSU87CgkJYnJlYWs7CgkvKiBHRVQgVGVtcGVyYXR1cmUgKHVzZWZ1bCB1bmRlciBBUE0pICovCgljYXNlIFNPTllQSV9JT0NHVEVNUDoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX1RFTVBfU1RBVFVTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldCA9IC1FSU5WQUw7Cgl9Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbnlwaV9taXNjX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkucmVhZAkJPSBzb255cGlfbWlzY19yZWFkLAoJLnBvbGwJCT0gc29ueXBpX21pc2NfcG9sbCwKCS5vcGVuCQk9IHNvbnlwaV9taXNjX29wZW4sCgkucmVsZWFzZQk9IHNvbnlwaV9taXNjX3JlbGVhc2UsCgkuZmFzeW5jCQk9IHNvbnlwaV9taXNjX2Zhc3luYywKCS5pb2N0bAkJPSBzb255cGlfbWlzY19pb2N0bCwKfTsKCnN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzb255cGlfbWlzY19kZXZpY2UgPSB7CgkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAoJLm5hbWUJCT0gInNvbnlwaSIsCgkuZm9wcwkJPSAmc29ueXBpX21pc2NfZm9wcywKfTsKCnN0YXRpYyB2b2lkIHNvbnlwaV9lbmFibGUodW5zaWduZWQgaW50IGNhbWVyYV9vbikKewoJc3dpdGNoIChzb255cGlfZGV2aWNlLm1vZGVsKSB7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTE6CgkJc29ueXBpX3R5cGUxX3NycygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOgoJCXNvbnlwaV90eXBlMl9zcnMoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzoKCQlzb255cGlfdHlwZTNfc3JzKCk7CgkJYnJlYWs7Cgl9CgoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2NhbGwyKDB4ODEsIDB4ZmYpOwoJc29ueXBpX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKCgkvKiBFbmFibGUgQUNQSSBtb2RlIHRvIGdldCBGbiBrZXkgZXZlbnRzICovCglpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCgkJb3V0YigweGYwLCAweGIyKTsKCglpZiAoY2FtZXJhICYmIGNhbWVyYV9vbikKCQlzb255cGlfY2FtZXJhX29uKCk7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2Rpc2FibGUodm9pZCkKewoJc29ueXBpX2NhbGwyKDB4ODEsIDApOwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBtb3JlIGV2ZW50cyAqLwoJaWYgKGNhbWVyYSkKCQlzb255cGlfY2FtZXJhX29mZigpOwoKCS8qIGRpc2FibGUgQUNQSSBtb2RlICovCglpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCgkJb3V0YigweGYxLCAweGIyKTsKCglzd2l0Y2ggKHNvbnlwaV9kZXZpY2UubW9kZWwpIHsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMToKCQlzb255cGlfdHlwZTFfZGlzKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI6CgkJc29ueXBpX3R5cGUyX2RpcygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOgoJCXNvbnlwaV90eXBlM19kaXMoKTsKCQlicmVhazsKCX0KCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QTQpzdGF0aWMgaW50IG9sZF9jYW1lcmFfcG93ZXI7CgpzdGF0aWMgaW50IHNvbnlwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCnsKCWlmIChsZXZlbCA9PSBTVVNQRU5EX0RJU0FCTEUpIHsKCQlvbGRfY2FtZXJhX3Bvd2VyID0gc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXI7CgkJc29ueXBpX2Rpc2FibGUoKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCnsKCWlmIChsZXZlbCA9PSBSRVNVTUVfRU5BQkxFKQoJCXNvbnlwaV9lbmFibGUob2xkX2NhbWVyYV9wb3dlcik7CglyZXR1cm4gMDsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHNvbnlwaV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXNvbnlwaV9kaXNhYmxlKCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzb255cGlfZHJpdmVyID0gewoJLm5hbWUJCT0gInNvbnlwaSIsCgkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKI2lmZGVmIENPTkZJR19QTQoJLnN1c3BlbmQJPSBzb255cGlfc3VzcGVuZCwKCS5yZXN1bWUJCT0gc29ueXBpX3Jlc3VtZSwKI2VuZGlmCgkuc2h1dGRvd24JPSBzb255cGlfc2h1dGRvd24sCn07CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfcHJvYmUodm9pZCkKewoJaW50IGksIHJldDsKCXN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgKmlvcG9ydF9saXN0OwoJc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3Q7CglzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwoKCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMTsKCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJCSAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzsKCWVsc2UKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjsKCglzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKCglzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJc29ueXBpX2RldmljZS5maWZvID0ga2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAoJCQkJCSAmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmZpZm8pKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CgkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmZpZm8pOwoJCWdvdG8gb3V0X2ZpZm87Cgl9CgoJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7Cglpbml0X01VVEVYKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSAtMTsKCglpZiAocGNpZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKCQlyZXQgPSAtRUlPOwoJCWdvdG8gb3V0X3BjaWVuYWJsZTsKCX0KCglpZiAobWlub3IgIT0gLTEpCgkJc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yID0gbWlub3I7CglpZiAoKHJldCA9IG1pc2NfcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSkpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKCQlnb3RvIG91dF9taXNjcmVnOwoJfQoKCglpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMV9pcnFfbGlzdDsKCX0gZWxzZSBpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMl9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTJfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKCX0gZWxzZSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTNfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTNfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlM19pcnFfbGlzdDsKCX0KCglmb3IgKGkgPSAwOyBpb3BvcnRfbGlzdFtpXS5wb3J0MTsgaSsrKSB7CgkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvcG9ydF9saXN0W2ldLnBvcnQxLAoJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKCQkJCSAgICJTb255IFByb2dyYW1hYmxlIEkvTyBEZXZpY2UiKSkgewoJCQkvKiBnZXQgdGhlIGlvcG9ydCAqLwoJCQlzb255cGlfZGV2aWNlLmlvcG9ydDEgPSBpb3BvcnRfbGlzdFtpXS5wb3J0MTsKCQkJc29ueXBpX2RldmljZS5pb3BvcnQyID0gaW9wb3J0X2xpc3RbaV0ucG9ydDI7CgkJCWJyZWFrOwoJCX0KCX0KCWlmICghc29ueXBpX2RldmljZS5pb3BvcnQxKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHJlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIik7CgkJcmV0ID0gLUVOT0RFVjsKCQlnb3RvIG91dF9yZXFyZWc7Cgl9CgoJZm9yIChpID0gMDsgaXJxX2xpc3RbaV0uaXJxOyBpKyspIHsKCgkJc29ueXBpX2RldmljZS5pcnEgPSBpcnFfbGlzdFtpXS5pcnE7CgkJc29ueXBpX2RldmljZS5iaXRzID0gaXJxX2xpc3RbaV0uYml0czsKCgkJaWYgKCFyZXF1ZXN0X2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSwKCQkJCSBTQV9TSElSUSwgInNvbnlwaSIsIHNvbnlwaV9pcnEpKQoJCQlicmVhazsKCX0KCglpZiAoIWlycV9saXN0W2ldLmlycSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXRfcmVxaXJxOwoJfQoKCWlmICh1c2VpbnB1dCkgewoJCS8qIEluaXRpYWxpemUgdGhlIElucHV0IERyaXZlcnM6IGpvZ2RpYWwgKi8KCQlpbnQgaTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYuZXZiaXRbMF0gPQoJCQlCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9CgkJCUJJVChCVE5fTUlERExFKTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYucmVsYml0WzBdID0gQklUKFJFTF9XSEVFTCk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2Lm5hbWUgPSBTT05ZUElfSk9HX0lOUFVUTkFNRTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYuaWQuYnVzdHlwZSA9IEJVU19JU0E7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCgkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOwoJCXByaW50ayhLRVJOX0lORk8gIiVzIGlucHV0IG1ldGhvZCBpbnN0YWxsZWQuXG4iLAoJCSAgICAgICBzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYubmFtZSk7CgoJCS8qIEluaXRpYWxpemUgdGhlIElucHV0IERyaXZlcnM6IHNwZWNpYWwga2V5cyAqLwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwoJCWZvciAoaSA9IDA7IHNvbnlwaV9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykKCQkJaWYgKHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldikKCQkJCXNldF9iaXQoc29ueXBpX2lucHV0a2V5c1tpXS5pbnB1dGV2LAoJCQkJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5rZXliaXQpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lID0gU09OWVBJX0tFWV9JTlBVVE5BTUU7CgkJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2LmlkLmJ1c3R5cGUgPSBCVVNfSVNBOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CgoJCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKCQlwcmludGsoS0VSTl9JTkZPICIlcyBpbnB1dCBtZXRob2QgaW5zdGFsbGVkLlxuIiwKCQkgICAgICAgc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2Lm5hbWUpOwoKCQlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5pbnB1dF9maWZvX2xvY2spOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyA9CgkJCWtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKCQkJCSAgICAmc29ueXBpX2RldmljZS5pbnB1dF9maWZvX2xvY2spOwoJCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKSkgewoJCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaToga2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKCQkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJCQlnb3RvIG91dF9pbmZpZm87CgkJfQoKCQlJTklUX1dPUksoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yaywgaW5wdXRfa2V5cmVsZWFzZSwgTlVMTCk7Cgl9CgoJc29ueXBpX2RldmljZS5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic29ueXBpIiwgLTEsCgkJCQkJCQkgICAgIE5VTEwsIDApOwoJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLnBkZXYpKSB7CgkJcmV0ID0gUFRSX0VSUihzb255cGlfZGV2aWNlLnBkZXYpOwoJCWdvdG8gb3V0X3BsYXRmb3JtZGV2OwoJfQoKCXNvbnlwaV9lbmFibGUoMCk7CgoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbGxlciBEcml2ZXIiCgkgICAgICAgInYlcy5cbiIsIFNPTllQSV9EUklWRVJfVkVSU0lPTik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldGVjdGVkIHR5cGUlZCBtb2RlbCwgIgoJICAgICAgICJ2ZXJib3NlID0gJWQsIGZua2V5aW5pdCA9ICVzLCBjYW1lcmEgPSAlcywgIgoJICAgICAgICJjb21wYXQgPSAlcywgbWFzayA9IDB4JTA4bHgsIHVzZWlucHV0ID0gJXMsIGFjcGkgPSAlc1xuIiwKCSAgICAgICBzb255cGlfZGV2aWNlLm1vZGVsLAoJICAgICAgIHZlcmJvc2UsCgkgICAgICAgZm5rZXlpbml0ID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIGNhbWVyYSA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBjb21wYXQgPyAib24iIDogIm9mZiIsCgkgICAgICAgbWFzaywKCSAgICAgICB1c2VpbnB1dCA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBTT05ZUElfQUNQSV9BQ1RJVkUgPyAib24iIDogIm9mZiIpOwoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBlbmFibGVkIGF0IGlycT0lZCwgcG9ydDE9MHgleCwgcG9ydDI9MHgleFxuIiwKCSAgICAgICBzb255cGlfZGV2aWNlLmlycSwKCSAgICAgICBzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UuaW9wb3J0Mik7CgoJaWYgKG1pbm9yID09IC0xKQoJCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZGV2aWNlIGFsbG9jYXRlZCBtaW5vciBpcyAlZFxuIiwKCQkgICAgICAgc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yKTsKCglyZXR1cm4gMDsKCm91dF9wbGF0Zm9ybWRldjoKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKb3V0X2luZmlmbzoKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYpOwoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CglmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7Cm91dF9yZXFpcnE6CglyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOwpvdXRfcmVxcmVnOgoJbWlzY19kZXJlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpOwpvdXRfbWlzY3JlZzoKCWlmIChwY2lkZXYpCgkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7Cm91dF9wY2llbmFibGU6CglrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuZmlmbyk7Cm91dF9maWZvOgoJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0IHNvbnlwaV9yZW1vdmUodm9pZCkKewoJc29ueXBpX2Rpc2FibGUoKTsKCglzeW5jaHJvbml6ZV9zY2hlZCgpOyAgLyogQWxsb3cgc29ueXBpIGludGVycnVwdCB0byBjb21wbGV0ZS4gKi8KCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CgoJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc29ueXBpX2RldmljZS5wZGV2KTsKCglpZiAodXNlaW5wdXQpIHsKCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2KTsKCQlrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7Cgl9CgoJZnJlZV9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEpOwoJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKCWlmIChzb255cGlfZGV2aWNlLmRldikKCQlwY2lfZGlzYWJsZV9kZXZpY2Uoc29ueXBpX2RldmljZS5kZXYpOwoJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmZpZm8pOwoJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiByZW1vdmVkLlxuIik7Cn0KCnN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNvbnlwaV9kbWlfdGFibGVbXSA9IHsKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDRy0iKSwKCQl9LAoJfSwKCXsKCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi0iKSwKCQl9LAoJfSwKCXsgfQp9OwoKc3RhdGljIGludCBfX2luaXQgc29ueXBpX2luaXQodm9pZCkKewoJaW50IHJldDsKCglpZiAoIWRtaV9jaGVja19zeXN0ZW0oc29ueXBpX2RtaV90YWJsZSkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCglyZXQgPSBzb255cGlfcHJvYmUoKTsKCWlmIChyZXQpCgkJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzb255cGlfZXhpdCh2b2lkKQp7Cglkcml2ZXJfdW5yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7Cglzb255cGlfcmVtb3ZlKCk7Cn0KCm1vZHVsZV9pbml0KHNvbnlwaV9pbml0KTsKbW9kdWxlX2V4aXQoc29ueXBpX2V4aXQpOwo=