LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGhhbmRsZXIgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV0X2RldmljZQogKiAgIHN0cnVjdHVyZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgovLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgovLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgovLyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgovLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgovLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgovLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CgojaW5jbHVkZSA8aGNmLmg+CiNpbmNsdWRlIDxkaGYuaD4KLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfcHJpdi5oPgojaW5jbHVkZSA8d2xfbWFpbi5oPgojaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CiNpbmNsdWRlIDx3bF93ZXh0Lmg+CgojaWZkZWYgVVNFX1BST0ZJTEUKI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLwoKI2lmZGVmIEJVU19QQ01DSUEKI2luY2x1ZGUgPHdsX2NzLmg+CiNlbmRpZiAgLyogQlVTX1BDTUNJQSAqLwoKI2lmZGVmIEJVU19QQ0kKI2luY2x1ZGUgPHdsX3BjaS5oPgojZW5kaWYgIC8qIEJVU19QQ0kgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBEQkcKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZiAgLyogREJHICovCgoKI2lmIEhDRl9FTkNBUAojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4gLSA4KQojZWxzZQojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4pCiNlbmRpZgoKLy9zdGF0aWMgaW50IG10dSA9IE1UVV9NQVg7Ci8vTU9EVUxFX1BBUk0obXR1LCAiaSIpOwovL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtYWNyb3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAogICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCiAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQoKI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaW5pdCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBXZSBuZXZlciBuZWVkIHRvIGRvIGFueXRoaW5nIHdoZW4gYSAiV2lyZWxlc3MiIGRldmljZSBpcyAiaW5pdGlhbGl6ZWQiCiAqICBieSB0aGUgbmV0IHNvZnR3YXJlLCBiZWNhdXNlIHdlIG9ubHkgcmVnaXN0ZXIgYWxyZWFkeS1mb3VuZCBjYXJkcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7Ci8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7Ci8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfaW5pdCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwoKICAgIC8qIE5vdGhpbmcgdG8gZG8sIGJ1dCBncmFiIHRoZSBzcGlubG9jayBhbnl3YXkganVzdCBpbiBjYXNlIHdlIGV2ZXIgbmVlZAogICAgICAgdGhpcyByb3V0aW5lICovCi8vICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci8vICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2luaXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBJbXBsZW1lbnQgdGhlIFNJT0NTSUZNQVAgaW50ZXJmYWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCiAqICAgICAgbWFwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBpZm1hcCBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwICkKewogICAgREJHX0ZVTkMoICJ3bF9jb25maWciICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwICk7CgogICAgLyogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuIFNpbmNlIHRoaXMgbm90IG5lZWRlZCwKICAgICAgIGlnbm9yZSB0aGUgcmVxdWVzdC4gKi8KICAgIERCR19UUkFDRShEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfY29uZmlnCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zdGF0cygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlIHN0YXRpc3RpY3MuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmV0d29yawogKiAgICAgIHN0YXRpc3RpY3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKI2lmZGVmIFVTRV9XRFMKICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDsKI2VuZGlmICAvKiBVU0VfV0RTICovCiAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7CiAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAgICAgKnBTdGF0czsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLy9EQkdfRlVOQyggIndsX3N0YXRzIiApOwogICAgLy9EQkdfRU5URVIoIERiZ0luZm8gKTsKICAgIC8vREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CgogICAgcFN0YXRzID0gTlVMTDsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoKCS8vREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gTlVMTDsKICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgogICAgLyogUmV0dXJuIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlICovCiNpZmRlZiBVU0VfV0RTCgogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7CgkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOwoJfQogICAgfQoKI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwogICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgewogICAgICAgIHBTdGF0cyA9ICYoIGxwLT5zdGF0cyApOwogICAgfQoKICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwoKICAgIC8vREJHX0xFQVZFKCBEYmdJbmZvICk7CgogICAgcmV0dXJuIHBTdGF0czsKfSAvLyB3bF9zdGF0cwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfb3BlbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBPcGVuIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzID0gSENGX1NVQ0NFU1M7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9vcGVuIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2Ugb3BlbiwgaW4gUlRTIG1vZGVcbiIgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gLUVJTzsKICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgojaWZkZWYgVVNFX1BST0ZJTEUKICAgIHBhcnNlX2NvbmZpZyggZGV2ICk7CiNlbmRpZgoKICAgIGlmKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQgKSB7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGluZyBQb3J0IDBcbiIgKTsKCXN0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKCiAgICAgICAgaWYoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcwogICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIGlmICggc3RybGVuKCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUgKSApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIjs/Pz8/IEtsdWRneSB3YXkgdG8gZm9yY2UgYSBkb3dubG9hZFxuIiApOwoJc3RhdHVzID0gd2xfZ28oIGxwICk7CiAgICB9IGVsc2UgewoJc3RhdHVzID0gd2xfYXBwbHkoIGxwICk7CiAgICB9CgogICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewoJLy8gVW5zdWNjZXNzZnVsLCB0cnkgcmVzZXQgb2YgdGhlIGNhcmQgdG8gcmVjb3ZlcgoJc3RhdHVzID0gd2xfcmVzZXQoIGRldiApOwogICAgfQoKICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCiAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCW5ldGlmX2NhcnJpZXJfb24oIGRldiApOwoJV0xfV0RTX05FVElGX0NBUlJJRVJfT04oIGxwICk7CgoJbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX0hBTkRMSU5HX0lOVDsgLy8gU3RhcnQgaGFuZGxpbmcgaW50ZXJydXB0cwogICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CgoJbmV0aWZfc3RhcnRfcXVldWUoIGRldiApOwoJV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBscCApOwogICAgfSBlbHNlIHsKICAgICAgICB3bF9oY2ZfZXJyb3IoIGRldiwgc3RhdHVzICk7CQkvKiBSZXBvcnQgdGhlIGVycm9yICovCiAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaCggZGV2ICk7CQkvKiBTdG9wIHRoZSBkZXZpY2UgYW5kIHF1ZXVlICovCiAgICB9CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX29wZW4KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2Nsb3NlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENsb3NlIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCJ3bF9jbG9zZSIpOwogICAgREJHX0VOVEVSKERiZ0luZm8pOwogICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwoKICAgIC8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLwogICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CiAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKCiAgICBuZXRpZl9jYXJyaWVyX29mZiggZGV2ICk7CiAgICBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYoIGxwICk7CgogICAgLyogU2h1dGRvd24gdGhlIGFkYXB0ZXI6CiAgICAgICAgICAgIERpc2FibGUgYWRhcHRlciBpbnRlcnJ1cHRzCiAgICAgICAgICAgIFN0b3AgVHgvUngKICAgICAgICAgICAgVXBkYXRlIHN0YXRpc3RpY3MKICAgICAgICAgICAgU2V0IGxvdyBwb3dlciBtb2RlCiAgICAqLwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKICAgIGxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOyAvLyBTdG9wIGhhbmRsaW5nIGludGVycnVwdHMKCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewoJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIGNsb3NlLCBpbiBSVFMgbW9kZVxuIiApOwoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiAtRUlPOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBEaXNhYmxlIHRoZSBwb3J0cyAqLwogICAgd2xfZGlzYWJsZSggbHAgKTsKCiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2Nsb3NlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgdm9pZCB3bF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQp7CiAgICBzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpIC0gMSk7CiAgICBzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OX1NUUiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7Ci8vCXN0cm5jcHkoaW5mby5md192ZXJzaW9uLCBwcml2LT5md19uYW1lLAovLwlzaXplb2YoaW5mby5md192ZXJzaW9uKSAtIDEpOwoKICAgIGlmIChkZXYtPmRldi5wYXJlbnQpIHsKICAgIAlkZXZfc2V0X25hbWUoZGV2LT5kZXYucGFyZW50LCAiJXMiLCBpbmZvLT5idXNfaW5mbyk7CgkvL3N0cm5jcHkoaW5mby0+YnVzX2luZm8sIGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkLAoJLy8Jc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEpOwogICAgfSBlbHNlIHsKCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSwKCQkiUENNQ0lBIEZJWE1FIik7Ci8vCQkgICAgIlBDTUNJQSAweCVseCIsIHByaXYtPmh3LmlvYmFzZSk7CiAgICB9Cn0gLy8gd2xfZ2V0X2RydmluZm8KCnN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgd2xfZXRodG9vbF9vcHMgPSB7CiAgICAuZ2V0X2RydmluZm8gPSB3bF9nZXRfZHJ2aW5mbywKICAgIC5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCn07CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaW9jdGwoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIElPQ1RMIGhhbmRsZXIgZm9yIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3QuCiAqICAgICAgcnEgIC0gYSBwb2ludGVyIHRvIHRoZSBJT0NUTCByZXF1ZXN0IGJ1ZmZlci4KICogICAgICBjbWQgLSB0aGUgSU9DVEwgY29tbWFuZCBjb2RlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kICkKewogICAgc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2lvY3RsIiApOwogICAgREJHX0VOVEVSKERiZ0luZm8pOwogICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwogICAgREJHX1BBUkFNKERiZ0luZm8sICJycSIsICIweCVwIiwgcnEpOwogICAgREJHX1BBUkFNKERiZ0luZm8sICJjbWQiLCAiMHglMDR4IiwgY21kKTsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCS8qIEhhbmRsZSBhbnkgUlRTIElPQ1RMIGhlcmUgKi8KCWlmKCBjbWQgPT0gV0xfSU9DVExfUlRTICkgewoJICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXTF9JT0NUTF9SVFNcbiIgKTsKCSAgICByZXQgPSB3dmxhbl9ydHMoIChzdHJ1Y3QgcnRzcmVxICopcnEsIGRldi0+YmFzZV9hZGRyICk7Cgl9IGVsc2UgewoJICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMIG5vdCBzdXBwb3J0ZWQgaW4gUlRTIG1vZGU6IDB4JVhcbiIsIGNtZCApOwoJICAgIHJldCA9IC1FT1BOT1RTVVBQOwoJfQoKCWdvdG8gb3V0X2FjdF9pbnRfb25fdW5sb2NrOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBPbmx5IGhhbmRsZSBVSUwgSU9DVEwgcmVxdWVzdHMgd2hlbiB0aGUgVUlMIGhhcyB0aGUgc3lzdGVtIGJsb2NrZWQuICovCiAgICBpZiggISgoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApICYmICggY21kICE9IFdWTEFOMl9JT0NUTF9VSUwgKSkpIHsKI2lmZGVmIFVTRV9VSUwKCXN0cnVjdCB1aWxyZXEgICp1cnEgPSAoc3RydWN0IHVpbHJlcSAqKXJxOwojZW5kaWYgLyogVVNFX1VJTCAqLwoKCXN3aXRjaCggY21kICkgewoJCS8vID09PT09PT09PT09PT09PT09PSBQcml2YXRlIElPQ1RMcyAodXAgdG8gMTYpID09PT09PT09PT09PT09PT09PQojaWZkZWYgVVNFX1VJTAoJY2FzZSBXVkxBTjJfSU9DVExfVUlMOgoJICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTFxuIiApOwoJICAgICByZXQgPSB3dmxhbl91aWwoIHVycSwgbHAgKTsKCSAgICAgYnJlYWs7CiNlbmRpZiAgLyogVVNFX1VJTCAqLwoKCWRlZmF1bHQ6CgkgICAgIERCR19UUkFDRShEYmdJbmZvLCAiSU9DVEwgQ09ERSBOT1QgU1VQUE9SVEVEOiAweCVYXG4iLCBjbWQgKTsKCSAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CgkgICAgIGJyZWFrOwoJfQogICAgfSBlbHNlIHsKCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiREVWSUNFIElTIEJVU1ksIENBTk5PVCBQUk9DRVNTIFJFUVVFU1RcbiIgKTsKCXJldCA9IC1FQlVTWTsKICAgIH0KCiNpZmRlZiBVU0VfUlRTCm91dF9hY3RfaW50X29uX3VubG9jazoKI2VuZGlmICAvKiBVU0VfUlRTICovCiAgICB3bF9hY3RfaW50X29uKCBscCApOwoKICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIHJldDsKfSAvLyB3bF9pb2N0bAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCnZvaWQgd2xfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgc3RydWN0IHB0X3JlZ3MgcmVnczsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CiAgICB3bF9pc3IoZGV2LT5pcnEsIGRldiwgJnJlZ3MpOwogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF90aW1lb3V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIGNhbGxlZCB3aGVuLCBmb3Igc29tZSByZWFzb24sIGEgVHggcmVxdWVzdCBpcyBub3QgY29tcGxldGVkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF90eF90aW1lb3V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewojaWZkZWYgVVNFX1dEUwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgY291bnQ7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwogICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcFN0YXRzID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3R4X3RpbWVvdXQiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lICk7CgogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyB0eF90aW1lb3V0IGhhbmRsZXIsIGluIFJUUyBtb2RlXG4iICk7Cgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybjsKICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgogICAgLyogRmlndXJlIG91dCB3aGljaCBkZXZpY2UgKHRoZSAicm9vdCIgZGV2aWNlIG9yIFdEUyBwb3J0KSB0aGlzIHRpbWVvdXQKICAgICAgIGlzIGZvciAqLwojaWZkZWYgVVNFX1dEUwoKICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CglpZiggZGV2ID09IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgewoJICAgIHBTdGF0cyA9ICYoIGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMgKTsKCgkgICAgLyogQnJlYWsgdGhlIGxvb3Agc28gdGhhdCB3ZSBjYW4gdXNlIHRoZSBjb3VudGVyIHRvIGFjY2VzcyBXRFMKCSAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KCSAgICBicmVhazsKCX0KICAgIH0KCiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgIC8qIElmIHBTdGF0cyBpcyBzdGlsbCBOVUxMLCB0aGVuIHRoZSBkZXZpY2UgaXMgbm90IGEgV0RTIHBvcnQgKi8KICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKCXBTdGF0cyA9ICYoIGxwLT5zdGF0cyApOwogICAgfQoKICAgIC8qIEFjY3VtdWxhdGUgdGhlIHRpbWVvdXQgZXJyb3IgKi8KICAgIHBTdGF0cy0+dHhfZXJyb3JzKys7CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfdHhfdGltZW91dAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfc2VuZCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHRyYW5zbWl0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgMSBvbiBlcnJvcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfc2VuZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoKICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOwogICAgREVTQ19TVFJDVCAgICAgICAgICAqZGVzYzsKICAgIFdWTEFOX0xGUkFNRSAgICAgICAgKnR4RiA9IE5VTEw7CiAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICplbGVtZW50OwogICAgaW50ICAgICAgICAgICAgICAgICBsZW47CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9zZW5kIiApOwoKICAgIGlmKCBscCA9PSBOVUxMICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmKCBscC0+ZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIENoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIEZJRHM7IGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwgZG9uJ3QgdGFrZSBhbnkKICAgICAgIGZyYW1lcyBvZmYgdGhlIHR4USAqLwogICAgaWYoIGxwLT5oY2ZDdHguSUZCX1JzY0luZCA9PSAwICkgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICAvKiBSZWNsYWltIHRoZSBUeFEgRWxlbWVudHMgYW5kIHBsYWNlIHRoZW0gYmFjayBvbiB0aGUgZnJlZSBxdWV1ZSAqLwogICAgaWYoICFsaXN0X2VtcHR5KCAmKCBscC0+dHhRWzBdICkpKSB7CiAgICAgICAgZWxlbWVudCA9IGxwLT50eFFbMF0ubmV4dDsKCiAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqIClsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKICAgICAgICBpZiggdHhGICE9IE5VTEwgKSB7CiAgICAgICAgICAgIGxwLT50eEYuc2tiICA9IHR4Ri0+ZnJhbWUuc2tiOwogICAgICAgICAgICBscC0+dHhGLnBvcnQgPSB0eEYtPmZyYW1lLnBvcnQ7CgogICAgICAgICAgICB0eEYtPmZyYW1lLnNrYiAgPSBOVUxMOwogICAgICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSAwOwoKICAgICAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKICAgICAgICAgICAgbGlzdF9hZGQoIGVsZW1lbnQsICYoIGxwLT50eEZyZWUgKSk7CgogICAgICAgICAgICBscC0+dHhRX2NvdW50LS07CgogICAgICAgICAgICBpZiggbHAtPnR4UV9jb3VudCA8IFRYX1FfTE9XX1dBVEVSX01BUksgKSB7CiAgICAgICAgICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewogICAgICAgICAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIktpY2tzdGFydGluZyBROiAlZFxuIiwgbHAtPnR4UV9jb3VudCApOwogICAgICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT5kZXYgKTsKICAgICAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKICAgICAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBscC0+dHhGLnNrYiA9PSBOVUxMICkgewogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICAvKiBJZiB0aGUgZGV2aWNlIGhhcyByZXNvdXJjZXMgKEZJRHMpIGF2YWlsYWJsZSwgdGhlbiBUeCB0aGUgcGFja2V0ICovCiAgICAvKiBGb3JtYXQgdGhlIFR4UmVxdWVzdCBhbmQgc2VuZCBpdCB0byB0aGUgYWRhcHRlciAqLwogICAgbGVuID0gbHAtPnR4Ri5za2ItPmxlbiA8IEVUSF9aTEVOID8gRVRIX1pMRU4gOiBscC0+dHhGLnNrYi0+bGVuOwoKICAgIGRlc2MgICAgICAgICAgICAgICAgICAgID0gJiggbHAtPmRlc2NfdHggKTsKICAgIGRlc2MtPmJ1Zl9hZGRyICAgICAgICAgID0gbHAtPnR4Ri5za2ItPmRhdGE7CiAgICBkZXNjLT5CVUZfQ05UICAgICAgICAgICA9IGxlbjsKICAgIGRlc2MtPm5leHRfZGVzY19hZGRyICAgID0gTlVMTDsKCiAgICBzdGF0dXMgPSBoY2Zfc2VuZF9tc2coICYoIGxwLT5oY2ZDdHggKSwgZGVzYywgbHAtPnR4Ri5wb3J0ICk7CgogICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKICAgICAgICBscC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CgogICAgICAgIERCR19UWCggRGJnSW5mbywgIlRyYW5zbWl0Li4uXG4iICk7CgogICAgICAgIGlmKCBscC0+dHhGLnBvcnQgPT0gSENGX1BPUlRfMCApIHsKICAgICAgICAgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKICAgICAgICAgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47CiAgICAgICAgfQoKI2lmZGVmIFVTRV9XRFMKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9wYWNrZXRzKys7CiAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47CiAgICAgICAgfQoKI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgICAgIC8qIEZyZWUgdGhlIHNrYiBhbmQgcGVyZm9ybSBxdWV1ZSBjbGVhbnVwLCBhcyB0aGUgYnVmZmVyIHdhcwogICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KICAgICAgICBkZXZfa2ZyZWVfc2tiKCBscC0+dHhGLnNrYiApOwoKICAgICAgICBscC0+dHhGLnNrYiA9IE5VTEw7CiAgICAgICAgbHAtPnR4Ri5wb3J0ID0gMDsKICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfSAvLyB3bF9zZW5kCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgVHggaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIG5ldHdvcmsgbGF5ZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGF0YSB0byB0cmFuc2Zlci4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnQgKQp7CiAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIFdWTEFOX0xGUkFNRSAgICAgICAgICAgICp0eEYgPSBOVUxMOwogICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKmVsZW1lbnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF90eCIgKTsKCiAgICAvKiBHcmFiIHRoZSBzcGlubG9jayAqLwogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIGlmKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSB7CiAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iICk7CiAgICAgICAgLyogU3RhcnQgZHJvcHBpbmcgcGFja2V0cyBoZXJlPz8/ICovCgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewogICAgICAgIERCR19QUklOVCggIlJUUzogd2UncmUgZ2V0dGluZyBhIFR4Li4uXG4iICk7Cgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KI2VuZGlmICAvKiBVU0VfUlRTICovCgogICAgaWYoICFscC0+dXNlX2RtYSApIHsKICAgICAgICAvKiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSAqLwogICAgICAgIGVsZW1lbnQgPSBscC0+dHhGcmVlLm5leHQ7CiAgICAgICAgdHhGID0gKFdWTEFOX0xGUkFNRSAqKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOwogICAgICAgIGlmKCB0eEYgPT0gTlVMTCApIHsKICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJvYmxlbSB3aXRoIGxpc3RfZW50cnlcbiIgKTsKCSAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIC8qIEZpbGwgb3V0IHRoZSBmcmFtZSAqLwogICAgICAgIHR4Ri0+ZnJhbWUuc2tiID0gc2tiOwogICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IHBvcnQ7CiAgICAgICAgLyogTW92ZSB0aGUgZnJhbWUgdG8gdGhlIHR4USAqLwogICAgICAgIC8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLwogICAgICAgIGxpc3RfZGVsKCAmKCB0eEYtPm5vZGUgKSk7CiAgICAgICAgbGlzdF9hZGQoICYoIHR4Ri0+bm9kZSApLCAmKCBscC0+dHhRWzBdICkpOwoKICAgICAgICBscC0+dHhRX2NvdW50Kys7CiAgICAgICAgaWYoIGxwLT50eFFfY291bnQgPj0gREVGQVVMVF9OVU1fVFhfRlJBTUVTICkgewogICAgICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJRIEZ1bGw6ICVkXG4iLCBscC0+dHhRX2NvdW50ICk7CiAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwogICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB3bF9hY3RfaW50X29mZiggbHAgKTsgLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCgogICAgLyogU2VuZCB0aGUgZGF0YSB0byB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCAqLwojaWZkZWYgRU5BQkxFX0RNQQogICAgaWYoIGxwLT51c2VfZG1hICkgewogICAgICAgIHdsX3NlbmRfZG1hKCBscCwgc2tiLCBwb3J0ICk7CiAgICB9CiAgICBlbHNlCiNlbmRpZgogICAgewogICAgICAgIHdsX3NlbmQoIGxwICk7CiAgICB9CiAgICAvKiBSZS1lbmFibGUgSW50ZXJydXB0cywgcmVsZWFzZSB0aGUgc3BpbmxvY2sgYW5kIHJldHVybiAqLwogICAgd2xfYWN0X2ludF9vbiggbHAgKTsKICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfdHgKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3J4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgcmVjZXB0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYjsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIHBrdGxlbjsKICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIGhmc19zdGF0OwogICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2M7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoIndsX3J4IikKICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKCiAgICBpZighKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgewoKI2lmZGVmIFVTRV9SVFMKICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewogICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKICAgICAgICAgICAgcmV0dXJuIC1FSU87CiAgICAgICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAgICAgLyogUmVhZCB0aGUgSEZTX1NUQVQgcmVnaXN0ZXIgZnJvbSB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwogICAgICAgIGhmc19zdGF0ID0gKGhjZl8xNikoKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVCArIDFdIDw8IDggKSk7CgogICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCiAgICAgICAgaWYoKCBoZnNfc3RhdCAmIEhGU19TVEFUX0VSUiApICE9IEhDRl9TVUNDRVNTICkgewogICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkhGU19TVEFUX0VSUk9SICgweCV4KSBpbiBSeCBQYWNrZXRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApOwogICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICB9CgogICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCiAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwogICAgICAgIERCR19SWCggRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0ICk7CgogICAgICAgIHBrdGxlbiA9IGxwLT5oY2ZDdHguSUZCX1J4TGVuOwogICAgICAgIGlmIChwa3RsZW4gIT0gMCkgewogICAgICAgICAgICBza2IgPSBBTExPQ19TS0IocGt0bGVuKTsKICAgICAgICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLwogICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgewojaWZkZWYgVVNFX1dEUwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQtMV0uZGV2OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRlc2MgPSAmKCBscC0+ZGVzY19yeCApOwoKICAgICAgICAgICAgICAgIGRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKCi8qCiNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKICAgIGRlc2MtPmJ1Zl9hZGRyID0gYnVmOyBcCiAgICBkZXNjLT5CVUZfU0laRSA9IGxlbjsgXAogICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKKi8KCiAgICAgICAgICAgICAgICBHRVRfUEFDS0VUKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKCiAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewogICAgICAgICAgICAgICAgICAgIG5ldGlmX3J4KCBza2IgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCiNpZmRlZiBXSVJFTEVTU19FWFQKI2lmZGVmIFdJUkVMRVNTX1NQWQogICAgICAgICAgICAgICAgICAgIGlmKCBscC0+c3B5ZGF0YS5zcHlfbnVtYmVyID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3JjYWRkciA9IHNrYi0+bWFjLnJhdyArIE1BQ19BRERSX1NJWkU7CgogICAgICAgICAgICAgICAgICAgICAgICB3bF9zcHlfZ2F0aGVyKCBkZXYsIHNyY2FkZHIgKTsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJSeCByZXF1ZXN0IHRvIGNhcmQgRkFJTEVEXG4iICk7CgogICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICAgICAgfQojaWZkZWYgVVNFX1dEUwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKCiAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOwogICAgICAgICAgICAgICAgfQojZW5kaWYgIC8qIFVTRV9XRFMgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9yeAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfbXVsdGljYXN0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZ1bmN0aW9uIHRvIGhhbmRsZSBtdWx0aWNhc3QgcGFja2V0cwogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmZGVmIE5FV19NVUxUSUNBU1QKCnZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CgogICAgaW50ICAgICAgICAgICAgICAgICB4OwogICAgc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX211bHRpY2FzdCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CgogICAgaWYoICF3bF9hZGFwdGVyX2lzX29wZW4oIGRldiApKSB7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKI2lmIERCRwogICAgaWYoIERCR19GTEFHUyggRGJnSW5mbyApICYgREJHX1BBUkFNX09OICkgewogICAgICAgIERCR19QUklOVCgiICBmbGFnczogJXMlcyVzXG4iLAogICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApID8gIlByb21pc2NvdXMgIiA6ICIiLAogICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUICkgPyAiTXVsdGljYXN0ICIgOiAiIiwKICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkgPyAiQWxsLU11bHRpY2FzdCIgOiAiIiApOwoKICAgICAgICBEQkdfUFJJTlQoICIgIG1jX2NvdW50OiAlZFxuIiwgbmV0ZGV2X21jX2NvdW50KGRldikpOwoKCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCglEQkdfUFJJTlQoIiAgICAlcE0gKCVkKVxuIiwgaGEtPmFkZHIsIGRldi0+YWRkcl9sZW4pOwogICAgfQojZW5kaWYgLyogREJHICovCgogICAgaWYoISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKCiNpZmRlZiBVU0VfUlRTCiAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgbXVsdGljYXN0LCBpbiBSVFMgbW9kZVxuIiApOwoKICAgICAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgICAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CiAgICAgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CgoJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKICAgICAgICAgICAgaWYoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMSApOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgUHJvbWlzY3VvdXMgbW9kZSAoSUZGX1BST01JU0MpXG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgobmV0ZGV2X21jX2NvdW50KGRldikgPiBIQ0ZfTUFYX01VTFRJQ0FTVCkgfHwKICAgICAgICAgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSkgewogICAgICAgICAgICAgICAgLyogU2h1dHRpbmcgb2ZmIHRoaXMgZmlsdGVyIHdpbGwgZW5hYmxlIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHRvCiAgICAgICAgICAgICAgICAgICBiZSBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsIHNvCiAgICAgICAgICAgICAgICAgICBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIkVuYWJsaW5nIGFsbCBtdWx0aWNhc3QgbW9kZSAoSUZGX0FMTE1VTFRJKVxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiAgICAgICAgICAgICAgICB3bF9hcHBseSggbHAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghbmV0ZGV2X21jX2VtcHR5KGRldikpIHsKICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAoIG5ldGRldl9tY19jb3VudChkZXYpICogMyApICsgMTsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CgoJCXggPSAwOwoJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCYobHAtPmx0dlJlY29yZC51LnU4W3grKyAqIEVUSF9BTEVOXSksCgkJCSAgIGhhLT5hZGRyLCBFVEhfQUxFTik7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJTZXR0aW5nIG11bHRpY2FzdCBsaXN0XG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBQcm9taXNjdW91cyBtb2RlXG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCiAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIG11bHRpY2FzdCBtb2RlICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIE11bHRpY2FzdCBtb2RlXG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCiAgICAgICAgICAgICAgICAvKiBUdXJuaW5nIG9uIHRoaXMgZmlsdGVyIHdpbGwgcHJldmVudCBhbGwgbXVsdGljYXN0IGZyYW1lcyBmcm9tCiAgICAgICAgICAgICAgICAgICBiZWluZyBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsCiAgICAgICAgICAgICAgICAgICBzbyBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgfQogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiNlbmRpZiAvKiBIQ0ZfU1RBICovCn0gLy8gd2xfbXVsdGljYXN0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZWxzZSAvKiBORVdfTVVMVElDQVNUICovCgp2b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMgKQp7CiAgICBEQkdfRlVOQyggIndsX211bHRpY2FzdCIpOwogICAgREJHX0VOVEVSKERiZ0luZm8pOwoKICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJhZGRycyIsICIweCVwIiwgYWRkcnMgKTsKCiNlcnJvciBPYnNvbGV0ZSBzZXQgbXVsdGljYXN0IGludGVyZmFjZSEKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyB3bF9tdWx0aWNhc3QKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNlbmRpZiAvKiBORVdfTVVMVElDQVNUICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsX25ldGRldl9vcHMgPQp7CiAgICAubmRvX3N0YXJ0X3htaXQgICAgICAgICA9ICZ3bF90eF9wb3J0MCwKCiAgICAubmRvX3NldF9jb25maWcgICAgICAgICA9ICZ3bF9jb25maWcsCiAgICAubmRvX2dldF9zdGF0cyAgICAgICAgICA9ICZ3bF9zdGF0cywKICAgIC5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gJndsX211bHRpY2FzdCwKCiAgICAubmRvX2luaXQgICAgICAgICAgICAgICA9ICZ3bF9pbnNlcnQsCiAgICAubmRvX29wZW4gICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX29wZW4sCiAgICAubmRvX3N0b3AgICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX2Nsb3NlLAogICAgLm5kb19kb19pb2N0bCAgICAgICAgICAgPSAmd2xfaW9jdGwsCgogICAgLm5kb190eF90aW1lb3V0ICAgICAgICAgPSAmd2xfdHhfdGltZW91dCwKCiNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogICAgLm5kb19wb2xsX2NvbnRyb2xsZXIgICAgPSB3bF9wb2xsLAojZW5kaWYKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2RldmljZV9hbGxvYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDcmVhdGUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgYW5kIHdsX3ByaXZhdGUgZm9yIHRoZSBuZXcgYWRhcHRlcgogKiAgYW5kIHJlZ2lzdGVyIHRoZSBkZXZpY2UncyBlbnRyeSBwb2ludHMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgYSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgbmV0X2RldmljZSBzdHJ1Y3QgZm9yIHRoaXMKICogICAgICBkZXZpY2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0cnVjdCBuZXRfZGV2aWNlICogd2xfZGV2aWNlX2FsbG9jKCB2b2lkICkKewogICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2RldmljZV9hbGxvYyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8qIEFsbG9jIGEgbmV0X2RldmljZSBzdHJ1Y3QgKi8KICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2xfcHJpdmF0ZSkpOwogICAgaWYgKCFkZXYpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogSW5pdGlhbGl6ZSB0aGUgJ25leHQnIHBvaW50ZXIgaW4gdGhlIHN0cnVjdC4gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgUENJLAogICAgICAgYnV0IGRvIGl0IGhlcmUganVzdCBpbiBjYXNlIGl0J3MgdXNlZCBmb3Igb3RoZXIgYnVzZXMgaW4gdGhlIGZ1dHVyZSAqLwogICAgbHAgPSB3bF9wcml2KGRldik7CgoKICAgIC8qIENoZWNrIE1UVSAqLwogICAgaWYoIGRldi0+bXR1ID4gTVRVX01BWCApCiAgICB7CgkgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlczogTVRVIHNldCB0b28gaGlnaCwgbGltaXRpbmcgdG8gJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIE1UVV9NQVggKTsKICAgIAlkZXYtPm10dSA9IE1UVV9NQVg7CiAgICB9CgogICAgLyogU2V0dXAgdGhlIGZ1bmN0aW9uIHRhYmxlIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwoKICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsX2l3X2hhbmRsZXJfZGVmOwogICAgbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOwogICAgZGV2LT53aXJlbGVzc19kYXRhID0gJmxwLT53aXJlbGVzc19kYXRhOwoKICAgIGRldi0+bmV0ZGV2X29wcyA9ICZ3bF9uZXRkZXZfb3BzOwoKICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKCiAgICBkZXYtPmV0aHRvb2xfb3BzCSAgICA9ICZ3bF9ldGh0b29sX29wczsKCiAgICBuZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKCiAgICAvKiBBbGxvY2F0ZSB2aXJ1dGFsIGRldmljZXMgZm9yIFdEUyBzdXBwb3J0IGlmIG5lZWRlZCAqLwogICAgV0xfV0RTX0RFVklDRV9BTExPQyggbHAgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiBkZXY7Cn0gLy8gd2xfZGV2aWNlX2FsbG9jCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9kZXZpY2VfZGVhbGxvYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGcmVlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIGFuZCB3bF9wcml2YXRlIHN0cmN1dHJlcyBmb3IgYW4gYWRhcHRlcgogKiAgYW5kIHBlcmZvcm0gYmFzaWMgY2xlYW51cC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7Ci8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfZGV2aWNlX2RlYWxsb2MiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBEZWFsbG9jIHRoZSBXRFMgcG9ydHMgKi8KICAgIFdMX1dEU19ERVZJQ0VfREVBTExPQyggbHAgKTsKCiAgICBmcmVlX25ldGRldiggZGV2ICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfZGV2aWNlX2RlYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3BvcnQwKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8wLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4X3BvcnQwKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAwXG4iICk7CgogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMCApOwojaWZkZWYgRU5BQkxFX0RNQQogICAgcmV0dXJuIHdsX3R4X2RtYSggc2tiLCBkZXYsIEhDRl9QT1JUXzAgKTsKI2VuZGlmCn0gLy8gd2xfdHhfcG9ydDAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpZmRlZiBVU0VfV0RTCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0MSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzEuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0MSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMVxuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMSApOwp9IC8vIHdsX3R4X3BvcnQxCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0MigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMi4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0Miggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMlxuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMiApOwp9IC8vIHdsX3R4X3BvcnQyCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0MygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMy4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0Myggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgM1xuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMyApOwp9IC8vIHdsX3R4X3BvcnQzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0NCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0NCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNFxuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNCApOwp9IC8vIHdsX3R4X3BvcnQ0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0NSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0NSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNVxuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNSApOwp9IC8vIHdsX3R4X3BvcnQ1Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0NigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzYuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNi4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0Niggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNlxuIiApOwogICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNiApOwp9IC8vIHdsX3R4X3BvcnQ2Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfZGV2aWNlX2FsbG9jKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSB0byByZXByZXNlbnQgdGhlIFdEUyBwb3J0cywgYW5kIHJlZ2lzdGVyCiAqICB0aGUgZGV2aWNlJ3MgZW50cnkgcG9pbnRzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQSwgYnV0IHdpbGwgcGxhY2UgcG9pbnRlcnMgdG8gdGhlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgbmV0X2RldmljZQogKiAgICAgIHN0cnVjdHMgaW4gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfd2RzX2RldmljZV9hbGxvYyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8qIFdEUyBzdXBwb3J0IHJlcXVpcmVzIGFkZGl0aW9uYWwgbmV0X2RldmljZSBzdHJ1Y3RzIHRvIGJlIGFsbG9jYXRlZCwKICAgICAgIHNvIHRoYXQgdXNlciBzcGFjZSBhcHBzIGNhbiB1c2UgdGhlc2UgdmlydHVhbCBkZXZpY2VzIHRvIHNwZWNpZnkgdGhlCiAgICAgICBwb3J0IG9uIHdoaWNoIHRvIFR4L1J4ICovCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfd2RzID0gTlVMTDsKCiAgICAgICAgZGV2X3dkcyA9IGttYWxsb2MoIHNpemVvZiggc3RydWN0IG5ldF9kZXZpY2UgKSwgR0ZQX0tFUk5FTCApOwogICAgICAgIG1lbXNldCggZGV2X3dkcywgMCwgc2l6ZW9mKCBzdHJ1Y3QgbmV0X2RldmljZSApKTsKCiAgICAgICAgZXRoZXJfc2V0dXAoIGRldl93ZHMgKTsKCiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBkZXZfd2RzOwoKICAgICAgICAvKiBSZS11c2Ugd2xfaW5pdCBmb3IgYWxsIHRoZSBkZXZpY2VzLCBhcyBpdCBjdXJyZW50bHkgZG9lcyBub3RoaW5nLCBidXQKICAgICAgICAgICBpcyByZXF1aXJlZC4gUmUtdXNlIHRoZSBzdGF0cy90eF90aW1lb3V0IGhhbmRsZXIgZm9yIGFsbCBhcyB3ZWxsOyB0aGUKICAgICAgICAgICBXRFMgcG9ydCB3aGljaCBpcyByZXF1ZXN0aW5nIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGRldGVybWluZWQgYnkKICAgICAgICAgICB0aGUgbmV0X2RldmljZSBwb2ludGVyLiBTZXQgdGhlIHByaXZhdGUgbWVtYmVyIG9mIGFsbCBkZXZpY2VzIHRvIHBvaW50CiAgICAgICAgICAgdG8gdGhlIHNhbWUgbmV0X2RldmljZSBzdHJ1Y3Q7IHRoYXQgd2F5LCBhbGwgaW5mb3JtYXRpb24gZ2V0cwogICAgICAgICAgIGZ1bm5lbGxlZCB0aHJvdWdoIHRoZSBvbmUgInJlYWwiIG5ldF9kZXZpY2UuIE5hbWUgdGhlIFdEUyBwb3J0cwogICAgICAgICAgICJ3ZHM8bj4iICovCiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmluaXQgICAgICAgICAgID0gJndsX2luaXQ7CiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmdldF9zdGF0cyAgICAgID0gJndsX3N0YXRzOwogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT50eF90aW1lb3V0ICAgICA9ICZ3bF90eF90aW1lb3V0OwogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnByaXYgICAgICAgICAgID0gbHA7CgogICAgICAgIHNwcmludGYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5uYW1lLCAid2RzJWQiLCBjb3VudCApOwogICAgfQoKICAgIC8qIFJlZ2lzdGVyIHRoZSBUeCBoYW5kbGVycyAqLwogICAgbHAtPndkc19wb3J0WzBdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQxOwogICAgbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOwogICAgbHAtPndkc19wb3J0WzJdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQzOwogICAgbHAtPndkc19wb3J0WzNdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ0OwogICAgbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OwogICAgbHAtPndkc19wb3J0WzVdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ2OwoKICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19kZXZpY2VfYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19kZXZpY2VfZGVhbGxvYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGcmVlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIHN0cnVjdHVyZXMgdXNlZCB0byBzdXBwb3J0IFdEUy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfd2RzX2RldmljZV9kZWFsbG9jIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CgogICAgICAgIGRldl93ZHMgPSBscC0+d2RzX3BvcnRbY291bnRdLmRldjsKCiAgICAgICAgaWYoIGRldl93ZHMgIT0gTlVMTCApIHsKICAgICAgICAgICAgaWYoIGRldl93ZHMtPmZsYWdzICYgSUZGX1VQICkgewogICAgICAgICAgICAgICAgZGV2X2Nsb3NlKCBkZXZfd2RzICk7CiAgICAgICAgICAgICAgICBkZXZfd2RzLT5mbGFncyAmPSB+KCBJRkZfVVAgfCBJRkZfUlVOTklORyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmcmVlX25ldGRldihkZXZfd2RzKTsKICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfZGV2aWNlX2RlYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHN0YXJ0IHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCiAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gc3RvcCB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcwogKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHdha2UgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCiAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewogICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIHByZXNlbnQgb24gYWxsIG9mIHRoZQogKiAgICAgICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24oIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIE5PVCBwcmVzZW50IG9uIGFsbCBvZgogKiAgICAgIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICkgewogICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmICAvKiBVU0VfV0RTICovCgojaWZkZWYgRU5BQkxFX0RNQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zZW5kX2RtYSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHRyYW5zbWl0cyB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgogKiAgICAgIHNrYiAgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgbGF5ZXIncyBkYXRhIGJ1ZmZlci4KICogICAgICBwb3J0IC0gdGhlIEhlcm1lcyBwb3J0IG9uIHdoaWNoIHRvIHRyYW5zbWl0LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9zZW5kX2RtYSggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcG9ydCApCnsKICAgIGludCAgICAgICAgIGxlbjsKICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOwogICAgREVTQ19TVFJDVCAqZGVzY19uZXh0ID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3NlbmRfZG1hIiApOwoKICAgIGlmKCBscCA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApCiAgICB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCgogICAgaWYoIHNrYiA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfV0FSTklORyAoRGJnSW5mbywgIk5vdGhpbmcgdG8gc2VuZC5cbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBsZW4gPSBza2ItPmxlbjsKCiAgICAvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KICAgIGRlc2MgPSB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIGxwICk7CgogICAgaWYoIGRlc2MgPT0gTlVMTCApCiAgICB7CiAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewogICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7CiAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwogICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKCiAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgU0VUX0JVRl9DTlQoIGRlc2MsIC8qSENGX0RNQV9GRF9DTlQqL0hGU19BRERSX0RFU1QgKTsKICAgIFNFVF9CVUZfU0laRSggZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKCiAgICBkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKCiAgICBpZiggZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJETUEgZGVzY3JpcHRvciBidWZfYWRkciBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIENvcHkgdGhlIHBheWxvYWQgaW50byB0aGUgRE1BIHBhY2tldCAqLwogICAgbWVtY3B5KCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbiApOwoKICAgIFNFVF9CVUZfQ05UKCBkZXNjX25leHQsIGxlbiApOwogICAgU0VUX0JVRl9TSVpFKCBkZXNjX25leHQsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKCiAgICBoY2ZfZG1hX3R4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjLCAwICk7CgogICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCiAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLwogICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CgogICAgcmV0dXJuIFRSVUU7Cn0gLy8gd2xfc2VuZF9kbWEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3J4X2RtYSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHJlY2VwdGlvbiB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3J4X2RtYSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIHBrdGxlbjsKICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSBOVUxMOwogICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2MsICpkZXNjX25leHQ7CiAgICAvL0NGR19NQl9JTkZPX1JBTkdFMl9TVFJDVCB4OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCJ3bF9yeCIpCiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CgogICAgaWYoKCggbHAgPSBkZXYtPnByaXYgKSAhPSBOVUxMICkgJiYKCSEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgojaWZkZWYgVVNFX1JUUwogICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwogICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgICAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKICAgICAgICAvL3sKICAgICAgICAgICAgZGVzYyA9IGhjZl9kbWFfcnhfZ2V0KCAmKCBscC0+aGNmQ3R4ICkpOwoKICAgICAgICAgICAgaWYoIGRlc2MgIT0gTlVMTCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBpZigoKCAqKGhjZl84ICopJmRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUXSApICYKICAgICAgICAgICAgICAgICAgICAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICkpID09IEhGU19TVEFUX1dNUF9NU0cgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkdvdCBhIFdNUCBmcmFtZVxuIiApOwoKICAgICAgICAgICAgICAgICAgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOwoJCQkJICAgIHgudHlwID0gQ0ZHX01CX0lORk87CgkJCQkgICAgeC5iYXNlX3R5cCA9IENGR19XTVA7CgkJCQkgICAgeC5mcmFnX2NudCA9IDI7CgkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2xlbiAgPSBHRVRfQlVGX0NOVCggZGVzY3AgKSAvIHNpemVvZiggaGNmXzE2ICk7CgkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPmJ1Zl9hZGRyIDsKCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyIDsKCiAgICAgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOwoKICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzbid0IGVtcHR5ICovCiAgICAgICAgICAgICAgICBpZiggR0VUX0JVRl9DTlQoIGRlc2MgKSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIiApOwoKICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwogICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCiAgICAgICAgICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOwoKICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCiAgICAgICAgICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOwoKICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwogICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLwogICAgICAgICAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwogICAgICAgICAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKCiAgICAgICAgICAgICAgICBwa3RsZW4gPSBHRVRfQlVGX0NOVChkZXNjX25leHQpOwogICAgICAgICAgICAgICAgaWYgKHBrdGxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQtMV0uZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1BBQ0tFVF9ETUEoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApCgkgICAgICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CgkgICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBVU0VfV0RTICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgLy99CiAgICB9CgogICAgcmV0dXJuIDA7Cn0gLy8gd2xfcnhfZG1hCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiNlbmRpZiAgLy8gRU5BQkxFX0RNQQo=