LyoKICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgojaW5jbHVkZSA8bGludXgvZXJyLmg+CiNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgoKI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgoKI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX1ZFUlNJT04oU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOwoKc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwoKc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGZua2V5aW5pdCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCgkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOwoKc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhjYW1lcmEsCgkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKCnN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAoJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cm1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWFzaywKCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKCnN0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOwptb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModXNlaW5wdXQsCgkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwoKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxCTEKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzCTMKCi8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgojZGVmaW5lIFNPTllQSV9UWVBFMV9CQVNFCQkweDUwCiNkZWZpbmUgU09OWVBJX0cxMEEJCQkoU09OWVBJX1RZUEUxX0JBU0UrMHgxNCkKI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAojZGVmaW5lIFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUCTB4MDQKCi8qIHR5cGUyIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfU0lSUQkJCTB4OWIKI2RlZmluZSBTT05ZUElfU0xPQgkJCTB4OWMKI2RlZmluZSBTT05ZUElfU0hJQgkJCTB4OWQKI2RlZmluZSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkUJMHgyMAojZGVmaW5lIFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUCTB4MTIKCi8qIHR5cGUzIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfVFlQRTNfQkFTRQkJMHg0MAojZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19NSVNDCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg2ZCkgLyogOCBiaXRzICAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19SRUdJT05fU0laRQkweDIwCiNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgoKLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgYWRkcmVzc2VzICovCiNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CiNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAojZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgojZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CiNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCiNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYwojZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CiNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCgovKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KI2RlZmluZSBTT05ZUElfRkFOMF9TVEFUVVMJMHg5MwojZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCgovKiBpb3BvcnRzIHVzZWQgZm9yIGJyaWdodG5lc3MgYW5kIHR5cGUyIGV2ZW50cyAqLwojZGVmaW5lIFNPTllQSV9EQVRBX0lPUE9SVAkweDYyCiNkZWZpbmUgU09OWVBJX0NTVF9JT1BPUlQJMHg2NgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpb3BvcnRzICovCnN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgewoJdTE2CXBvcnQxOwoJdTE2CXBvcnQyOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3Qgc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0W10gPSB7Cgl7IDB4MTBjMCwgMHgxMGM0IH0sCS8qIGxvb2tzIGxpa2UgdGhlIGRlZmF1bHQgb24gQzFWeCAqLwoJeyAweDEwODAsIDB4MTA4NCB9LAoJeyAweDEwOTAsIDB4MTA5NCB9LAoJeyAweDEwYTAsIDB4MTBhNCB9LAoJeyAweDEwYjAsIDB4MTBiNCB9LAoJeyAweDAsIDB4MCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3RbXSA9IHsKCXsgMHgxMDgwLCAweDEwODQgfSwKCXsgMHgxMGEwLCAweDEwYTQgfSwKCXsgMHgxMGMwLCAweDEwYzQgfSwKCXsgMHgxMGUwLCAweDEwZTQgfSwKCXsgMHgwLCAweDAgfQp9OwoKLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICpzb255cGlfdHlwZTNfaW9wb3J0X2xpc3QgPQoJc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpbnRlcnJ1cHRzICovCnN0cnVjdCBzb255cGlfaXJxX2xpc3QgewoJdTE2CWlycTsKCXUxNgliaXRzOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUxX2lycV9saXN0W10gPSB7Cgl7IDExLCAweDIgfSwJLyogSVJRIDExLCBHTzIyPTAsR08yMz0xIGluIEFNTCAqLwoJeyAxMCwgMHgxIH0sCS8qIElSUSAxMCwgR08yMj0xLEdPMjM9MCBpbiBBTUwgKi8KCXsgIDUsIDB4MCB9LAkvKiBJUlEgIDUsIEdPMjI9MCxHTzIzPTAgaW4gQU1MICovCgl7ICAwLCAweDMgfQkvKiBubyBJUlEsIEdPMjI9MSxHTzIzPTEgaW4gQU1MICovCn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCBzb255cGlfdHlwZTJfaXJxX2xpc3RbXSA9IHsKCXsgMTEsIDB4ODAgfSwJLyogSVJRIDExLCAweDgwIGluIFNJUlEgaW4gQU1MICovCgl7IDEwLCAweDQwIH0sCS8qIElSUSAxMCwgMHg0MCBpbiBTSVJRIGluIEFNTCAqLwoJeyAgOSwgMHgyMCB9LAkvKiBJUlEgIDksIDB4MjAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgIDYsIDB4MTAgfSwJLyogSVJRICA2LCAweDEwIGluIFNJUlEgaW4gQU1MICovCgl7ICAwLCAweDAwIH0JLyogbm8gSVJRLCAweDAwIGluIFNJUlEgaW4gQU1MICovCn07CgovKiBzYW1lIGFzIGluIHR5cGUyIG1vZGVscyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQojZGVmaW5lIFNPTllQSV9DQU1FUkFfSFVFCQkJMgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJCTUKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QwojZGVmaW5lIFNPTllQSV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9NQVNLCTB4MwojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKCi8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0NfTUFTSwkJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRET1dOX1JFUVVFU1QJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTIAkJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKCiNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9SRVZJU0lPTiAJCQk4CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQoKLyogRXZlbnQgbWFza3MgKi8KI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCiNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKI2RlZmluZSBTT05ZUElfRk5LRVlfTUFTSwkJCTB4MDAwMDAwMDQKI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4CiNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKI2RlZmluZSBTT05ZUElfQkFDS19NQVNLCQkJMHgwMDAwMDAyMAojZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCiNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKI2RlZmluZSBTT05ZUElfWk9PTV9NQVNLCQkJMHgwMDAwMDEwMAojZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAojZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCiNkZWZpbmUgU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCQkweDAwMDAwODAwCiNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKI2RlZmluZSBTT05ZUElfV0lSRUxFU1NfTUFTSwkJCTB4MDAwMDIwMDAKCnN0cnVjdCBzb255cGlfZXZlbnQgewoJdTgJZGF0YTsKCXU4CWV2ZW50Owp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3JlbGVhc2VldltdID0gewoJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfam9nZ2VyZXZbXSA9IHsKCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAoJeyAweDVmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEIH0sCgl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAoJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCgl7IDB4MDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiB9LAoJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKCXsgMHgxZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgfSwKCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAoJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCgl7IDB4NDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCB9LAoJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewoJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAoJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCgl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0gewoJeyAweDEwLCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDIH0sCgl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAoJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKCXsgMHgxMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YzIH0sCgl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAoJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKCXsgMHgxNiwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2IH0sCgl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAoJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKCXsgMHgxOSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5IH0sCgl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAoJeyAweDFjLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEyIH0sCgl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAoJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAoJeyAweDIyLCBTT05ZUElfRVZFTlRfRk5LRVlfMiB9LAoJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAoJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAoJeyAweDMzLCBTT05ZUElfRVZFTlRfRk5LRVlfRiB9LAoJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAoJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAoJeyAweDM2LCBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKCXsgMHgwMSwgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKCXsgMHg1YywgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JsdWVldltdID0gewoJeyAweDU1LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgfSwKCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7Cgl7IDB4NTksIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhY2tldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2hlbHBldltdID0gewoJeyAweDNiLCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbGlkIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbGlkZXZbXSA9IHsKCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKCXsgMHg1MCwgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKCXsgMHgzOSwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgdGh1bWJwaHJhc2UgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7Cgl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtb3Rpb25leWUgY2FtZXJhIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7Cgl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0gewoJeyAweDUzLCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUIH0sCgl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhdHRlcnlldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCgl7IDAsIDAgfQp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB7CglpbnQJCQltb2RlbDsKCXU4CQkJZGF0YTsKCXVuc2lnbmVkIGxvbmcJCW1hc2s7CglzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOwp9IHNvbnlwaV9ldmVudHR5cGVzW10gPSB7Cgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg3MCwgU09OWVBJX01FWUVfTUFTSywgc29ueXBpX21leWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MTAsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIwLCBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSywgc29ueXBpX3RodW1icGhyYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCXsgMCB9Cn07CgojZGVmaW5lIFNPTllQSV9CVUZfU0laRQkxMjgKCi8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cyBhbmQgaW5wdXQgbGF5ZXIgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3QgewoJaW50IHNvbnlwaWV2OwoJaW50IGlucHV0ZXY7Cn0gc29ueXBpX2lucHV0a2V5c1tdID0gewoJeyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VELAkgCUtFWV9DQU1FUkEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFksIAkJS0VZX0ZOIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9FU0MsIAkJS0VZX0ZOX0VTQyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEsIAkJS0VZX0ZOX0YxIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMiwgCQlLRVlfRk5fRjIgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YzLCAJCUtFWV9GTl9GMyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjQsIAkJS0VZX0ZOX0Y0IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNSwgCQlLRVlfRk5fRjUgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2LCAJCUtFWV9GTl9GNiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjcsIAkJS0VZX0ZOX0Y3IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GOCwgCQlLRVlfRk5fRjggfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5LAkJS0VZX0ZOX0Y5IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTAsCQlLRVlfRk5fRjEwIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTEsIAkJS0VZX0ZOX0YxMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyLAkJS0VZX0ZOX0YxMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMSwgCQlLRVlfRk5fMSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfMiwgCQlLRVlfRk5fMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRCwJCQlLRVlfRk5fRCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRSwJCQlLRVlfRk5fRSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRiwJCQlLRVlfRk5fRiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfUywJCQlLRVlfRk5fUyB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfQiwJCQlLRVlfRk5fQiB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQsIAlLRVlfQkxVRSB9LAoJeyBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OLCAJCUtFWV9CTFVFIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AxLCAJCUtFWV9QUk9HMSB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMiwgCQlLRVlfUFJPRzIgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDMsIAkJS0VZX1BST0czIH0sCgl7IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQsIAkJS0VZX0JBQ0sgfSwKCXsgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCwgCQlLRVlfSEVMUCB9LAoJeyBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VELCAJCUtFWV9aT09NIH0sCgl7IFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VELCAJQlROX1RIVU1CIH0sCgl7IDAsIDAgfSwKfTsKCnN0cnVjdCBzb255cGlfa2V5cHJlc3MgewoJc3RydWN0IGlucHV0X2RldiAqZGV2OwoJaW50IGtleTsKfTsKCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2RldmljZSB7CglzdHJ1Y3QgcGNpX2RldiAqZGV2OwoJdTE2IGlycTsKCXUxNiBiaXRzOwoJdTE2IGlvcG9ydDE7Cgl1MTYgaW9wb3J0MjsKCXUxNiByZWdpb25fc2l6ZTsKCXUxNiBldnR5cGVfb2Zmc2V0OwoJaW50IGNhbWVyYV9wb3dlcjsKCWludCBibHVldG9vdGhfcG93ZXI7CglzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CglzdHJ1Y3Qga2ZpZm8gKmZpZm87CglzcGlubG9ja190IGZpZm9fbG9jazsKCXdhaXRfcXVldWVfaGVhZF90IGZpZm9fcHJvY19saXN0OwoJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZpZm9fYXN5bmM7CglpbnQgb3Blbl9jb3VudDsKCWludCBtb2RlbDsKCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2pvZ19kZXY7CglzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9rZXlfZGV2OwoJc3RydWN0IHdvcmtfc3RydWN0IGlucHV0X3dvcms7CglzdHJ1Y3Qga2ZpZm8gKmlucHV0X2ZpZm87CglzcGlubG9ja190IGlucHV0X2ZpZm9fbG9jazsKfSBzb255cGlfZGV2aWNlOwoKI2RlZmluZSBJVEVSQVRJT05TX0xPTkcJCTEwMDAwCiNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAoKI2RlZmluZSB3YWl0X29uX2NvbW1hbmQocXVpZXQsIGNvbW1hbmQsIGl0ZXJhdGlvbnMpIHsgXAoJdW5zaWduZWQgaW50IG4gPSBpdGVyYXRpb25zOyBcCgl3aGlsZSAoLS1uICYmIChjb21tYW5kKSkgXAoJCXVkZWxheSgxKTsgXAoJaWYgKCFuICYmICh2ZXJib3NlIHx8ICFxdWlldCkpIFwKCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb255cGkgY29tbWFuZCBmYWlsZWQgYXQgJXMgOiAlcyAobGluZSAlZClcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAp9CgojaWZkZWYgQ09ORklHX0FDUEkKI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgKCFhY3BpX2Rpc2FibGVkKQojZWxzZQojZGVmaW5lIFNPTllQSV9BQ1BJX0FDVElWRSAwCiNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwoKI2lmZGVmIENPTkZJR19BQ1BJCnN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNvbnlwaV9hY3BpX2RldmljZTsKc3RhdGljIGludCBhY3BpX2RyaXZlcl9yZWdpc3RlcmVkOwojZW5kaWYKCnN0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfd3JpdGUoYWRkciwgdmFsdWUpOwojZW5kaWYKCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKDB4ODEsIFNPTllQSV9DU1RfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcCh2YWx1ZSwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2VjX3JlYWQodTggYWRkciwgdTggKnZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfcmVhZChhZGRyLCB2YWx1ZSk7CiNlbmRpZgoJd2FpdF9vbl9jb21tYW5kKDEsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDMsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoMHg4MCwgU09OWVBJX0NTVF9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoYWRkciwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJKnZhbHVlID0gaW5iX3AoU09OWVBJX0RBVEFfSU9QT1JUKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGVjX3JlYWQxNih1OCBhZGRyLCB1MTYgKnZhbHVlKQp7Cgl1OCB2YWxfbGIsIHZhbF9oYjsKCWlmIChzb255cGlfZWNfcmVhZChhZGRyLCAmdmFsX2xiKSkKCQlyZXR1cm4gLTE7CglpZiAoc29ueXBpX2VjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQoJCXJldHVybiAtMTsKCSp2YWx1ZSA9IHZhbF9sYiB8ICh2YWxfaGIgPDwgOCk7CglyZXR1cm4gMDsKfQoKLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTFfc3JzKHZvaWQpCnsKCXUzMiB2OwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSAodiAmIDB4RkZGRjAwMDApIHwgKCh1MzIpIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRkYwRkZGRikgfAoJICAgICgoKHUzMikgc29ueXBpX2RldmljZS5pb3BvcnQxIF4gc29ueXBpX2RldmljZS5pb3BvcnQyKSA8PCAxNik7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOwoJdiAmPSB+KCgodTMyKSAweDMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOwoJdiB8PSAoKCh1MzIpIHNvbnlwaV9kZXZpY2UuYml0cykgPDwgU09OWVBJX0lSUV9TSElGVCk7CglvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRjFGRkZGRikgfCAweDAwQzAwMDAwOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfc3JzKHZvaWQpCnsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NISUIsIChzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweEZGMDApID4+IDgpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TTE9CLCBzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweDAwRkYpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCBzb255cGlfZGV2aWNlLmJpdHMpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cgl1ZGVsYXkoMTApOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTNfc3JzKHZvaWQpCnsKCXUxNiB2MTY7Cgl1OCAgdjg7CgoJLyogVGhpcyBtb2RlbCB0eXBlIHVzZXMgdGhlIHNhbWUgaW5pdGlhbGlhemF0aW9uIG9mCgkgKiB0aGUgZW1iZWRkZWQgY29udHJvbGxlciBhcyB0aGUgdHlwZTIgbW9kZWxzLiAqLwoJc29ueXBpX3R5cGUyX3NycygpOwoKCS8qIEluaXRpYWxpemF0aW9uIG9mIFBDSSBjb25maWcgc3BhY2Ugb2YgdGhlIExQQyBpbnRlcmZhY2UgYnJpZGdlLiAqLwoJdjE2ID0gKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkZGMCkgfCAweDAxOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgdjE2KTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgJnY4KTsKCXY4ID0gKHY4ICYgMHhDRikgfCAweDEwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgdjgpOwp9CgovKiBEaXNhYmxlcyB0aGUgZGV2aWNlIC0gdGhpcyBjb21lcyBmcm9tIHRoZSBBTUwgY29kZSBpbiB0aGUgQUNQSSBiaW9zICovCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9kaXModm9pZCkKewoJdTMyIHY7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9IHYgJiAweEZGM0ZGRkZGOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwoKCXYgPSBpbmwoU09OWVBJX0lSUV9QT1JUKTsKCXYgfD0gKDB4MyA8PCBTT05ZUElfSVJRX1NISUZUKTsKCW91dGwodiwgU09OWVBJX0lSUV9QT1JUKTsKfQoKc3RhdGljIHZvaWQgc29ueXBpX3R5cGUyX2Rpcyh2b2lkKQp7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSElCLCAwKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgMCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NJUlEsIDApKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19kaXModm9pZCkKewoJc29ueXBpX3R5cGUyX2RpcygpOwoJdWRlbGF5KDEwKTsKCXBjaV93cml0ZV9jb25maWdfd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX0dJRDIsIDApOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwxKHU4IGRldikKewoJdTggdjEsIHYyOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcmV0dXJuIHYyOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwyKHU4IGRldiwgdTggZm4pCnsKCXU4IHYxOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXJldHVybiB2MTsKfQoKc3RhdGljIHU4IHNvbnlwaV9jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQp7Cgl1OCB2MTsKCgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZm4sIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKHYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglyZXR1cm4gdjE7Cn0KCiNpZiAwCi8qIEdldCBicmlnaHRuZXNzLCBodWUgZXRjLiBVbnJlbGlhYmxlLi4uICovCnN0YXRpYyB1OCBzb255cGlfcmVhZCh1OCBmbikKewoJdTggdjEsIHYyOwoJaW50IG4gPSAxMDA7CgoJd2hpbGUgKG4tLSkgewoJCXYxID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKCQl2MiA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CgkJaWYgKHYxID09IHYyICYmIHYxICE9IDB4ZmYpCgkJCXJldHVybiB2MTsKCX0KCXJldHVybiAweGZmOwp9CiNlbmRpZgoKLyogU2V0IGJyaWdodG5lc3MsIGh1ZSBldGMgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldCh1OCBmbiwgdTggdikKewoJd2FpdF9vbl9jb21tYW5kKDAsIHNvbnlwaV9jYWxsMygweDkwLCBmbiwgdiksIElURVJBVElPTlNfU0hPUlQpOwp9CgovKiBUZXN0cyBpZiB0aGUgY2FtZXJhIGlzIHJlYWR5ICovCnN0YXRpYyBpbnQgc29ueXBpX2NhbWVyYV9yZWFkeSh2b2lkKQp7Cgl1OCB2OwoKCXYgPSBzb255cGlfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOwoJcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwp9CgovKiBUdXJucyB0aGUgY2FtZXJhIG9mZiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29mZih2b2lkKQp7Cglzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgU09OWVBJX0NBTUVSQV9NVVRFX01BU0spOwoKCWlmICghc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCgkJcmV0dXJuOwoKCXNvbnlwaV9jYWxsMigweDkxLCAwKTsKCXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyID0gMDsKfQoKLyogVHVybnMgdGhlIGNhbWVyYSBvbiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29uKHZvaWQpCnsKCWludCBpLCBqOwoKCWlmIChzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKCQlyZXR1cm47CgoJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgewoKCQl3aGlsZSAoc29ueXBpX2NhbGwyKDB4OTEsIDB4MSkpCgkJCW1zbGVlcCgxMCk7CgkJc29ueXBpX2NhbGwxKDB4OTMpOwoKCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKCQkJaWYgKHNvbnlwaV9jYW1lcmFfcmVhZHkoKSkKCQkJCWJyZWFrOwoJCQltc2xlZXAoMTApOwoJCX0KCQlpZiAoaSkKCQkJYnJlYWs7Cgl9CgoJaWYgKGogPT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaTogZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CgkJcmV0dXJuOwoJfQoKCXNvbnlwaV9zZXQoMHgxMCwgMHg1YSk7Cglzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDE7Cn0KCi8qIHNldHMgdGhlIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHU4IHN0YXRlKQp7CglzdGF0ZSA9ICEhc3RhdGU7CgoJaWYgKHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQoJCXJldHVybjsKCglzb255cGlfY2FsbDIoMHg5Niwgc3RhdGUpOwoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKfQoKc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZSh2b2lkICpkYXRhKQp7CglzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIGtwOwoKCXdoaWxlIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLCAodW5zaWduZWQgY2hhciAqKSZrcCwKCQkJIHNpemVvZihrcCkpID09IHNpemVvZihrcCkpIHsKCQltc2xlZXAoMTApOwoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDApOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCX0KfQoKc3RhdGljIHZvaWQgc29ueXBpX3JlcG9ydF9pbnB1dF9ldmVudCh1OCBldmVudCkKewoJc3RydWN0IGlucHV0X2RldiAqam9nX2RldiA9IHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXYgPSBzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXY7CglzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIGtwID0geyBOVUxMIH07CglpbnQgaTsKCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQOgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEOgoJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKCQlpbnB1dF9zeW5jKGpvZ19kZXYpOwoJCWJyZWFrOwoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTjoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEOgoJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAtMSk7CgkJaW5wdXRfc3luYyhqb2dfZGV2KTsKCQlicmVhazsKCgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQ6CgkJa3Aua2V5ID0gQlROX01JRERMRTsKCQlrcC5kZXYgPSBqb2dfZGV2OwoJCWJyZWFrOwoKCWNhc2UgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEOgoJCS8qIE5vdGhpbmcsIG5vdCBhbGwgVkFJT3MgZ2VuZXJhdGUgdGhpcyBldmVudCAqLwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZm9yIChpID0gMDsgc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldjsgaSsrKQoJCQlpZiAoZXZlbnQgPT0gc29ueXBpX2lucHV0a2V5c1tpXS5zb255cGlldikgewoJCQkJa3AuZGV2ID0ga2V5X2RldjsKCQkJCWtwLmtleSA9IHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldjsKCQkJCWJyZWFrOwoJCQl9CgkJYnJlYWs7Cgl9CgoJaWYgKGtwLmRldikgewoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDEpOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCQlrZmlmb19wdXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLAoJCQkgICh1bnNpZ25lZCBjaGFyICopJmtwLCBzaXplb2Yoa3ApKTsKCQlzY2hlZHVsZV93b3JrKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmspOwoJfQp9CgovKiBJbnRlcnJ1cHQgaGFuZGxlcjogc29tZSBldmVudCBpcyBhdmFpbGFibGUgKi8Kc3RhdGljIGlycXJldHVybl90IHNvbnlwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJdTggdjEsIHYyLCBldmVudCA9IDA7CglpbnQgaSwgajsKCgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MiA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSArIHNvbnlwaV9kZXZpY2UuZXZ0eXBlX29mZnNldCk7CgoJZm9yIChpID0gMDsgc29ueXBpX2V2ZW50dHlwZXNbaV0ubW9kZWw7IGkrKykgewoJCWlmIChzb255cGlfZGV2aWNlLm1vZGVsICE9IHNvbnlwaV9ldmVudHR5cGVzW2ldLm1vZGVsKQoJCQljb250aW51ZTsKCQlpZiAoKHYyICYgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkgIT0KCQkgICAgc29ueXBpX2V2ZW50dHlwZXNbaV0uZGF0YSkKCQkJY29udGludWU7CgkJaWYgKCEobWFzayAmIHNvbnlwaV9ldmVudHR5cGVzW2ldLm1hc2spKQoJCQljb250aW51ZTsKCQlmb3IgKGogPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewoJCQlpZiAodjEgPT0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKCQkJCWV2ZW50ID0gc29ueXBpX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OwoJCQkJZ290byBmb3VuZDsKCQkJfQoJCX0KCX0KCglpZiAodmVyYm9zZSkKCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICJzb255cGk6IHVua25vd24gZXZlbnQgcG9ydDE9MHglMDJ4LHBvcnQyPTB4JTAyeFxuIiwKCQkgICAgICAgdjEsIHYyKTsKCS8qIFdlIG5lZWQgdG8gcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgYmVjYXVzZSB0aGVyZSAqYXJlKgoJICogZXZlbnRzIGJlbG9uZ2luZyB0byB0aGUgc29ueXBpIGRldmljZSB3ZSBkb24ndCBrbm93IGFib3V0LAoJICogYnV0IHdlIHN0aWxsIGRvbid0IHdhbnQgdGhvc2UgdG8gcG9sbHV0ZSB0aGUgbG9ncy4uLiAqLwoJcmV0dXJuIElSUV9IQU5ETEVEOwoKZm91bmQ6CglpZiAodmVyYm9zZSA+IDEpCgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAic29ueXBpOiBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLCB2MSwgdjIpOwoKCWlmICh1c2VpbnB1dCkKCQlzb255cGlfcmVwb3J0X2lucHV0X2V2ZW50KGV2ZW50KTsKCiNpZmRlZiBDT05GSUdfQUNQSQoJaWYgKHNvbnlwaV9hY3BpX2RldmljZSkKCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChzb255cGlfYWNwaV9kZXZpY2UsIDEsIGV2ZW50KTsKI2VuZGlmCgoJa2ZpZm9fcHV0KHNvbnlwaV9kZXZpY2UuZmlmbywgKHVuc2lnbmVkIGNoYXIgKikmZXZlbnQsIHNpemVvZihldmVudCkpOwoJa2lsbF9mYXN5bmMoJnNvbnlwaV9kZXZpY2UuZmlmb19hc3luYywgU0lHSU8sIFBPTExfSU4pOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCi8qIEV4dGVybmFsIGNhbWVyYSBjb21tYW5kIChleHBvcnRlZCB0byB0aGUgbW90aW9uIGV5ZSB2NGwgZHJpdmVyKSAqLwppbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKewoJaWYgKCFjYW1lcmEpCgkJcmV0dXJuIC1FSU87CgoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCglzd2l0Y2ggKGNvbW1hbmQpIHsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBOgoJCWlmICh2YWx1ZSkKCQkJc29ueXBpX2NhbWVyYV9vbigpOwoJCWVsc2UKCQkJc29ueXBpX2NhbWVyYV9vZmYoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVDoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBSFVFOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1I6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkU6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQUdDOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHNvbnlwaV9jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKCQkgICAgICAgY29tbWFuZCk7CgkJYnJlYWs7Cgl9Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpFWFBPUlRfU1lNQk9MKHNvbnlwaV9jYW1lcmFfY29tbWFuZCk7CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCnsKCWludCByZXR2YWw7CgoJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZzb255cGlfZGV2aWNlLmZpZm9fYXN5bmMpOwoJaWYgKHJldHZhbCA8IDApCgkJcmV0dXJuIHJldHZhbDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXNvbnlwaV9taXNjX2Zhc3luYygtMSwgZmlsZSwgMCk7Cglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc29ueXBpX2RldmljZS5vcGVuX2NvdW50LS07Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CgkvKiBGbHVzaCBpbnB1dCBxdWV1ZSBvbiBmaXJzdCBvcGVuICovCglpZiAoIXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCkKCQlrZmlmb19yZXNldChzb255cGlfZGV2aWNlLmZpZm8pOwoJc29ueXBpX2RldmljZS5vcGVuX2NvdW50Kys7Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAoJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKewoJc3NpemVfdCByZXQ7Cgl1bnNpZ25lZCBjaGFyIGM7CgoJaWYgKChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSA9PSAwKSAmJgoJICAgIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCgkJcmV0dXJuIC1FQUdBSU47CgoJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QsCgkJCQkgICAgICAga2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgIT0gMCk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJd2hpbGUgKHJldCA8IGNvdW50ICYmCgkgICAgICAgKGtmaWZvX2dldChzb255cGlfZGV2aWNlLmZpZm8sICZjLCBzaXplb2YoYykpID09IHNpemVvZihjKSkpIHsKCQlpZiAocHV0X3VzZXIoYywgYnVmKyspKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlyZXQrKzsKCX0KCglpZiAocmV0ID4gMCkgewoJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKCQlpbm9kZS0+aV9hdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHVuc2lnbmVkIGludCBzb255cGlfbWlzY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQp7Cglwb2xsX3dhaXQoZmlsZSwgJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QsIHdhaXQpOwoJaWYgKGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pKQoJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX21pc2NfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLAoJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglpbnQgcmV0ID0gMDsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJdTggdmFsODsKCXUxNiB2YWwxNjsKCglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJc3dpdGNoIChjbWQpIHsKCWNhc2UgU09OWVBJX0lPQ0dCUlQ6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9MQ0RfTElHSFQsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NCUlQ6CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9MQ0RfTElHSFQsIHZhbDgpKQoJCQlyZXQgPSAtRUlPOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDFDQVA6CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9GVUxMLCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMVJFTToKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0xFRlQsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQyQ0FQOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfRlVMTCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDJSRU06CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9MRUZULCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFURkxBR1M6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9CQVRfRkxBR1MsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJdmFsOCAmPSAweDA3OwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkxVRToKCQl2YWw4ID0gc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXI7CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NCTFVFOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHZhbDgpOwoJCWJyZWFrOwoJLyogRkFOIENvbnRyb2xzICovCgljYXNlIFNPTllQSV9JT0NHRkFOOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfRkFOMF9TVEFUVVMsICZ2YWw4KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ1NGQU46CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9GQU4wX1NUQVRVUywgdmFsOCkpCgkJCXJldCA9IC1FSU87CgkJYnJlYWs7CgkvKiBHRVQgVGVtcGVyYXR1cmUgKHVzZWZ1bCB1bmRlciBBUE0pICovCgljYXNlIFNPTllQSV9JT0NHVEVNUDoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX1RFTVBfU1RBVFVTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldCA9IC1FSU5WQUw7Cgl9Cgl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbnlwaV9taXNjX2ZvcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkucmVhZAkJPSBzb255cGlfbWlzY19yZWFkLAoJLnBvbGwJCT0gc29ueXBpX21pc2NfcG9sbCwKCS5vcGVuCQk9IHNvbnlwaV9taXNjX29wZW4sCgkucmVsZWFzZQk9IHNvbnlwaV9taXNjX3JlbGVhc2UsCgkuZmFzeW5jCQk9IHNvbnlwaV9taXNjX2Zhc3luYywKCS5pb2N0bAkJPSBzb255cGlfbWlzY19pb2N0bCwKfTsKCnN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzb255cGlfbWlzY19kZXZpY2UgPSB7CgkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAoJLm5hbWUJCT0gInNvbnlwaSIsCgkuZm9wcwkJPSAmc29ueXBpX21pc2NfZm9wcywKfTsKCnN0YXRpYyB2b2lkIHNvbnlwaV9lbmFibGUodW5zaWduZWQgaW50IGNhbWVyYV9vbikKewoJc3dpdGNoIChzb255cGlfZGV2aWNlLm1vZGVsKSB7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTE6CgkJc29ueXBpX3R5cGUxX3NycygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOgoJCXNvbnlwaV90eXBlMl9zcnMoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzoKCQlzb255cGlfdHlwZTNfc3JzKCk7CgkJYnJlYWs7Cgl9CgoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2NhbGwyKDB4ODEsIDB4ZmYpOwoJc29ueXBpX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKCgkvKiBFbmFibGUgQUNQSSBtb2RlIHRvIGdldCBGbiBrZXkgZXZlbnRzICovCglpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCgkJb3V0YigweGYwLCAweGIyKTsKCglpZiAoY2FtZXJhICYmIGNhbWVyYV9vbikKCQlzb255cGlfY2FtZXJhX29uKCk7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2Rpc2FibGUodm9pZCkKewoJc29ueXBpX2NhbGwyKDB4ODEsIDApOwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBtb3JlIGV2ZW50cyAqLwoJaWYgKGNhbWVyYSkKCQlzb255cGlfY2FtZXJhX29mZigpOwoKCS8qIGRpc2FibGUgQUNQSSBtb2RlICovCglpZiAoIVNPTllQSV9BQ1BJX0FDVElWRSAmJiBmbmtleWluaXQpCgkJb3V0YigweGYxLCAweGIyKTsKCglzd2l0Y2ggKHNvbnlwaV9kZXZpY2UubW9kZWwpIHsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMToKCQlzb255cGlfdHlwZTFfZGlzKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI6CgkJc29ueXBpX3R5cGUyX2RpcygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzOgoJCXNvbnlwaV90eXBlM19kaXMoKTsKCQlicmVhazsKCX0KCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19BQ1BJCnN0YXRpYyBpbnQgc29ueXBpX2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQp7Cglzb255cGlfYWNwaV9kZXZpY2UgPSBkZXZpY2U7CglzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCAiU29ueSBsYXB0b3AgaG90a2V5cyIpOwoJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICJzb255L2hvdGtleSIpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2FjcGlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKewoJc29ueXBpX2FjcGlfZGV2aWNlID0gTlVMTDsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlwaV9hY3BpX2RyaXZlciA9IHsKCS5uYW1lICAgICAgICAgICA9ICJzb255cGkiLAoJLmNsYXNzICAgICAgICAgID0gImhrZXkiLAoJLmlkcyAgICAgICAgICAgID0gIlNOWTYwMDEiLAoJLm9wcyAgICAgICAgICAgID0gewoJCSAgICAgICAgICAgLmFkZCA9IHNvbnlwaV9hY3BpX2FkZCwKCQkJICAgLnJlbW92ZSA9IHNvbnlwaV9hY3BpX3JlbW92ZSwKCX0sCn07CiNlbmRpZgoKc3RhdGljIGludCBfX2RldmluaXQgc29ueXBpX2NyZWF0ZV9pbnB1dF9kZXZpY2VzKHZvaWQpCnsKCXN0cnVjdCBpbnB1dF9kZXYgKmpvZ19kZXY7CglzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2OwoJaW50IGk7CglpbnQgZXJyb3I7CgoJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2ID0gam9nX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFqb2dfZGV2KQoJCXJldHVybiAtRU5PTUVNOwoKCWpvZ19kZXYtPm5hbWUgPSAiU29ueSBWYWlvIEpvZ2RpYWwiOwoJam9nX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JU0E7Cglqb2dfZGV2LT5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CgoJam9nX2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOwoJam9nX2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX01JRERMRSk7Cglqb2dfZGV2LT5yZWxiaXRbMF0gPSBCSVQoUkVMX1dIRUVMKTsKCglzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYgPSBrZXlfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWtleV9kZXYpIHsKCQllcnJvciA9IC1FTk9NRU07CgkJZ290byBlcnJfZnJlZV9qb2dkZXY7Cgl9CgoJa2V5X2Rldi0+bmFtZSA9ICJTb255IFZhaW8gS2V5cyI7CglrZXlfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKCWtleV9kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKCgkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KCWtleV9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7Cglmb3IgKGkgPSAwOyBzb255cGlfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCgkJaWYgKHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldikKCQkJc2V0X2JpdChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYsIGtleV9kZXYtPmtleWJpdCk7CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7CglpZiAoZXJyb3IpCgkJZ290byBlcnJfZnJlZV9rZXlkZXY7CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5X2Rldik7CglpZiAoZXJyb3IpCgkJZ290byBlcnJfdW5yZWdpc3Rlcl9qb2dkZXY7CgoJcmV0dXJuIDA7CgogZXJyX3VucmVnaXN0ZXJfam9nZGV2OgoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7CgkvKiBTZXQgdG8gTlVMTCBzbyB3ZSBkb24ndCBmcmVlIGl0IGFnYWluIGJlbG93ICovCglqb2dfZGV2ID0gTlVMTDsKIGVycl9mcmVlX2tleWRldjoKCWlucHV0X2ZyZWVfZGV2aWNlKGtleV9kZXYpOwoJc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2ID0gTlVMTDsKIGVycl9mcmVlX2pvZ2RldjoKCWlucHV0X2ZyZWVfZGV2aWNlKGpvZ19kZXYpOwoJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2ID0gTlVMTDsKCglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHNvbnlwaV9zZXR1cF9pb3BvcnRzKHN0cnVjdCBzb255cGlfZGV2aWNlICpkZXYsCgkJCQljb25zdCBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICppb3BvcnRfbGlzdCkKewoJd2hpbGUgKGlvcG9ydF9saXN0LT5wb3J0MSkgewoKCQlpZiAocmVxdWVzdF9yZWdpb24oaW9wb3J0X2xpc3QtPnBvcnQxLAoJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKCQkJCSAgICJTb255IFByb2dyYW1hYmxlIEkvTyBEZXZpY2UiKSkgewoJCQlkZXYtPmlvcG9ydDEgPSBpb3BvcnRfbGlzdC0+cG9ydDE7CgkJCWRldi0+aW9wb3J0MiA9IGlvcG9ydF9saXN0LT5wb3J0MjsKCQkJcmV0dXJuIDA7CgkJfQoJCWlvcG9ydF9saXN0Kys7Cgl9CgoJcmV0dXJuIC1FQlVTWTsKfQoKc3RhdGljIGludCBfX2RldmluaXQgc29ueXBpX3NldHVwX2lycShzdHJ1Y3Qgc29ueXBpX2RldmljZSAqZGV2LAoJCQkJICAgICAgY29uc3Qgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqaXJxX2xpc3QpCnsKCXdoaWxlIChpcnFfbGlzdC0+aXJxKSB7CgoJCWlmICghcmVxdWVzdF9pcnEoaXJxX2xpc3QtPmlycSwgc29ueXBpX2lycSwKCQkJCSBJUlFGX1NIQVJFRCwgInNvbnlwaSIsIHNvbnlwaV9pcnEpKSB7CgkJCWRldi0+aXJxID0gaXJxX2xpc3QtPmlycTsKCQkJZGV2LT5iaXRzID0gaXJxX2xpc3QtPmJpdHM7CgkJCXJldHVybiAwOwoJCX0KCQlpcnFfbGlzdCsrOwoJfQoKCXJldHVybiAtRUJVU1k7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzb255cGlfZGlzcGxheV9pbmZvKHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZGV0ZWN0ZWQgdHlwZSVkIG1vZGVsLCAiCgkgICAgICAgInZlcmJvc2UgPSAlZCwgZm5rZXlpbml0ID0gJXMsIGNhbWVyYSA9ICVzLCAiCgkgICAgICAgImNvbXBhdCA9ICVzLCBtYXNrID0gMHglMDhseCwgdXNlaW5wdXQgPSAlcywgYWNwaSA9ICVzXG4iLAoJICAgICAgIHNvbnlwaV9kZXZpY2UubW9kZWwsCgkgICAgICAgdmVyYm9zZSwKCSAgICAgICBmbmtleWluaXQgPyAib24iIDogIm9mZiIsCgkgICAgICAgY2FtZXJhID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIGNvbXBhdCA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBtYXNrLAoJICAgICAgIHVzZWlucHV0ID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIFNPTllQSV9BQ1BJX0FDVElWRSA/ICJvbiIgOiAib2ZmIik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGVuYWJsZWQgYXQgaXJxPSVkLCBwb3J0MT0weCV4LCBwb3J0Mj0weCV4XG4iLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaXJxLAoJICAgICAgIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCglpZiAobWlub3IgPT0gLTEpCgkJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXZpY2UgYWxsb2NhdGVkIG1pbm9yIGlzICVkXG4iLAoJCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7Cgljb25zdCBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICppb3BvcnRfbGlzdDsKCWNvbnN0IHN0cnVjdCBzb255cGlfaXJxX2xpc3QgKmlycV9saXN0OwoJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKCWludCBlcnJvcjsKCglzcGluX2xvY2tfaW5pdCgmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJc29ueXBpX2RldmljZS5maWZvID0ga2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAoJCQkJCSAmc29ueXBpX2RldmljZS5maWZvX2xvY2spOwoJaWYgKElTX0VSUihzb255cGlfZGV2aWNlLmZpZm8pKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CgkJcmV0dXJuIFBUUl9FUlIoc29ueXBpX2RldmljZS5maWZvKTsKCX0KCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0KTsKCWluaXRfTVVURVgoJnNvbnlwaV9kZXZpY2UubG9jayk7Cglzb255cGlfZGV2aWNlLmJsdWV0b290aF9wb3dlciA9IC0xOwoKCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMTsKCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJCSAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzsKCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAoJCQkJCSAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIE5VTEwpKSkKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzsKCWVsc2UKCQlzb255cGlfZGV2aWNlLm1vZGVsID0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjsKCglpZiAocGNpZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKCQllcnJvciA9IC1FSU87CgkJZ290byBlcnJfcHV0X3BjaWRldjsKCX0KCglzb255cGlfZGV2aWNlLmRldiA9IHBjaWRldjsKCglpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTFfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMV9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTFfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMV9pcnFfbGlzdDsKCX0gZWxzZSBpZiAoc29ueXBpX2RldmljZS5tb2RlbCA9PSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyKSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFMl9SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTJfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlMl9pcnFfbGlzdDsKCX0gZWxzZSB7CgkJaW9wb3J0X2xpc3QgPSBzb255cGlfdHlwZTNfaW9wb3J0X2xpc3Q7CgkJc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSA9IFNPTllQSV9UWVBFM19SRUdJT05fU0laRTsKCQlzb255cGlfZGV2aWNlLmV2dHlwZV9vZmZzZXQgPSBTT05ZUElfVFlQRTNfRVZUWVBFX09GRlNFVDsKCQlpcnFfbGlzdCA9IHNvbnlwaV90eXBlM19pcnFfbGlzdDsKCX0KCgllcnJvciA9IHNvbnlwaV9zZXR1cF9pb3BvcnRzKCZzb255cGlfZGV2aWNlLCBpb3BvcnRfbGlzdCk7CglpZiAoZXJyb3IpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogZmFpbGVkIHRvIHJlcXVlc3QgaW9wb3J0c1xuIik7CgkJZ290byBlcnJfZGlzYWJsZV9wY2lkZXY7Cgl9CgoJZXJyb3IgPSBzb255cGlfc2V0dXBfaXJxKCZzb255cGlfZGV2aWNlLCBpcnFfbGlzdCk7CglpZiAoZXJyb3IpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKCQlnb3RvIGVycl9mcmVlX2lvcG9ydHM7Cgl9CgoJaWYgKG1pbm9yICE9IC0xKQoJCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOwoJZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpOwoJaWYgKGVycm9yKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKCQlnb3RvIGVycl9mcmVlX2lycTsKCX0KCglzb255cGlfZGlzcGxheV9pbmZvKCk7CgoJaWYgKHVzZWlucHV0KSB7CgoJCWVycm9yID0gc29ueXBpX2NyZWF0ZV9pbnB1dF9kZXZpY2VzKCk7CgkJaWYgKGVycm9yKSB7CgkJCXByaW50ayhLRVJOX0VSUgoJCQkJInNvbnlwaTogZmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBkZXZpY2VzXG4iKTsKCQkJZ290byBlcnJfbWlzY2Rldl91bnJlZ2lzdGVyOwoJCX0KCgkJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8gPQoJCQlrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCgkJCQkgICAgJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKCQlpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbykpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CgkJCWVycm9yID0gUFRSX0VSUihzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJCQlnb3RvIGVycl9pbnBkZXZfdW5yZWdpc3RlcjsKCQl9CgoJCUlOSVRfV09SSygmc29ueXBpX2RldmljZS5pbnB1dF93b3JrLCBpbnB1dF9rZXlyZWxlYXNlLCBOVUxMKTsKCX0KCglzb255cGlfZW5hYmxlKDApOwoKCXJldHVybiAwOwoKIGVycl9pbnBkZXZfdW5yZWdpc3RlcjoKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOwogZXJyX21pc2NkZXZfdW5yZWdpc3RlcjoKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKIGVycl9mcmVlX2lycToKCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKIGVycl9mcmVlX2lvcG9ydHM6CglyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOwogZXJyX2Rpc2FibGVfcGNpZGV2OgoJaWYgKHBjaWRldikKCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKIGVycl9wdXRfcGNpZGV2OgoJcGNpX2Rldl9wdXQocGNpZGV2KTsKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKCglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBpbnQgX19kZXZleGl0IHNvbnlwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7Cglzb255cGlfZGlzYWJsZSgpOwoKCXN5bmNocm9uaXplX3NjaGVkKCk7ICAvKiBBbGxvdyBzb255cGkgaW50ZXJydXB0IHRvIGNvbXBsZXRlLiAqLwoJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKCglpZiAodXNlaW5wdXQpIHsKCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYpOwoJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CgkJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJfQoKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKCglmcmVlX2lycShzb255cGlfZGV2aWNlLmlycSwgc29ueXBpX2lycSk7CglyZWxlYXNlX3JlZ2lvbihzb255cGlfZGV2aWNlLmlvcG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOwoKCWlmIChzb255cGlfZGV2aWNlLmRldikgewoJCXBjaV9kaXNhYmxlX2RldmljZShzb255cGlfZGV2aWNlLmRldik7CgkJcGNpX2Rldl9wdXQoc29ueXBpX2RldmljZS5kZXYpOwoJfQoKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QTQpzdGF0aWMgaW50IG9sZF9jYW1lcmFfcG93ZXI7CgpzdGF0aWMgaW50IHNvbnlwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglvbGRfY2FtZXJhX3Bvd2VyID0gc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXI7Cglzb255cGlfZGlzYWJsZSgpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7Cglzb255cGlfZW5hYmxlKG9sZF9jYW1lcmFfcG93ZXIpOwoJcmV0dXJuIDA7Cn0KI2Vsc2UKI2RlZmluZSBzb255cGlfc3VzcGVuZAlOVUxMCiNkZWZpbmUgc29ueXBpX3Jlc3VtZQlOVUxMCiNlbmRpZgoKc3RhdGljIHZvaWQgc29ueXBpX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKewoJc29ueXBpX2Rpc2FibGUoKTsKfQoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc29ueXBpX2RyaXZlciA9IHsKCS5kcml2ZXIJCT0gewoJCS5uYW1lCT0gInNvbnlwaSIsCgkJLm93bmVyCT0gVEhJU19NT0RVTEUsCgl9LAoJLnByb2JlCQk9IHNvbnlwaV9wcm9iZSwKCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc29ueXBpX3JlbW92ZSksCgkuc2h1dGRvd24JPSBzb255cGlfc2h1dGRvd24sCgkuc3VzcGVuZAk9IHNvbnlwaV9zdXNwZW5kLAoJLnJlc3VtZQkJPSBzb255cGlfcmVzdW1lLAp9OwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNvbnlwaV9wbGF0Zm9ybV9kZXZpY2U7CgpzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBzb255cGlfZG1pX3RhYmxlW10gPSB7Cgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCgkJfSwKCX0sCgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tIiksCgkJfSwKCX0sCgl7IH0KfTsKCnN0YXRpYyBpbnQgX19pbml0IHNvbnlwaV9pbml0KHZvaWQpCnsKCWludCBlcnJvcjsKCglwcmludGsoS0VSTl9JTkZPCgkJInNvbnlwaTogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgRHJpdmVyIHYlcy5cbiIsCgkJU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCglpZiAoIWRtaV9jaGVja19zeXN0ZW0oc29ueXBpX2RtaV90YWJsZSkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwoJaWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCglzb255cGlfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb255cGkiLCAtMSk7CglpZiAoIXNvbnlwaV9wbGF0Zm9ybV9kZXZpY2UpIHsKCQllcnJvciA9IC1FTk9NRU07CgkJZ290byBlcnJfZHJpdmVyX3VucmVnaXN0ZXI7Cgl9CgoJZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNvbnlwaV9wbGF0Zm9ybV9kZXZpY2UpOwoJaWYgKGVycm9yKQoJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOwoKI2lmZGVmIENPTkZJR19BQ1BJCglpZiAoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255cGlfYWNwaV9kcml2ZXIpID49IDApCgkJYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCA9IDE7CiNlbmRpZgoKCXJldHVybiAwOwoKIGVycl9mcmVlX2RldmljZToKCXBsYXRmb3JtX2RldmljZV9wdXQoc29ueXBpX3BsYXRmb3JtX2RldmljZSk7CiBlcnJfZHJpdmVyX3VucmVnaXN0ZXI6CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7CglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzb255cGlfZXhpdCh2b2lkKQp7CiNpZmRlZiBDT05GSUdfQUNQSQoJaWYgKGFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQpCgkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnNvbnlwaV9hY3BpX2RyaXZlcik7CiNlbmRpZgoJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc29ueXBpX3BsYXRmb3JtX2RldmljZSk7CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7CglwcmludGsoS0VSTl9JTkZPICJzb255cGk6IHJlbW92ZWQuXG4iKTsKfQoKbW9kdWxlX2luaXQoc29ueXBpX2luaXQpOwptb2R1bGVfZXhpdChzb255cGlfZXhpdCk7Cg==