LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxeF9uZXRkZXYuYyAtIFJvdXRpbmVzIGFuZCBkYXRhIHJlcXVpcmVkIGJ5IGFsbCBMaW51eCBuZXR3b3JrIGRldmljZXMuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFNPRlRXQVJFIExJQ0VOU0UKICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwogKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCiAqCiAqIENvcHlyaWdodCCpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRGlzY2xhaW1lcgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCiAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwogKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICoKICovCgojaW5jbHVkZSAiZXQxMzF4X3ZlcnNpb24uaCIKI2luY2x1ZGUgImV0MTMxeF9kZWJ1Zy5oIgojaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgoKI2luY2x1ZGUgPGxpbnV4L21paS5oPgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKI2luY2x1ZGUgImV0MTMxMF9wbS5oIgojaW5jbHVkZSAiZXQxMzEwX2phZ2NvcmUuaCIKI2luY2x1ZGUgImV0MTMxMF9tYWMuaCIKI2luY2x1ZGUgImV0MTMxMF90eC5oIgoKI2luY2x1ZGUgImV0MTMxeF9hZGFwdGVyLmgiCiNpbmNsdWRlICJldDEzMXhfaXNyLmgiCiNpbmNsdWRlICJldDEzMXhfaW5pdHBjaS5oIgoKLyogRGF0YSBmb3IgZGVidWdnaW5nIGZhY2lsaXRpZXMgKi8KI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKZXh0ZXJuIGRiZ19pbmZvX3QgKmV0MTMxeF9kYmdpbmZvOwojZW5kaWYgLyogQ09ORklHX0VUMTMxWF9ERUJVRyAqLwoKc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0MTMxeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKaW50IGV0MTMxeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwppbnQgZXQxMzF4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwppbnQgZXQxMzF4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcmVxYnVmLCBpbnQgY21kKTsKdm9pZCBldDEzMXhfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwppbnQgZXQxMzF4X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwp2b2lkIGV0MTMxeF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwppbnQgZXQxMzF4X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOwppbnQgZXQxMzF4X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpuZXdfbWFjKTsKdm9pZCBldDEzMXhfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKdm9pZCBldDEzMXhfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CnZvaWQgZXQxMzF4X3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKCi8qKgogKiBldDEzMXhfZGV2aWNlX2FsbG9jCiAqCiAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlIHN0cnVjdCBmb3IKICogdGhpcyBkZXZpY2UuCiAqCiAqIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBmb3IgdGhlIG5ldyBhZGFwdGVyIGFuZAogKiByZWdpc3RlciB0aGUgZGV2aWNlJ3MgZW50cnkgcG9pbnRzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KICovCnN0cnVjdCBuZXRfZGV2aWNlICpldDEzMXhfZGV2aWNlX2FsbG9jKHZvaWQpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CgoJREJHX0VOVEVSKGV0MTMxeF9kYmdpbmZvKTsKCgkvKiBBbGxvYyBuZXRfZGV2aWNlIGFuZCBhZGFwdGVyIHN0cnVjdHMgKi8KCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIpKTsKCglpZiAobmV0ZGV2ID09IE5VTEwpIHsKCQlEQkdfRVJST1IoZXQxMzF4X2RiZ2luZm8sCgkJCSAgIkFsbG9jIG9mIG5ldF9kZXZpY2Ugc3RydWN0IGZhaWxlZFxuIik7CgkJREJHX0xFQVZFKGV0MTMxeF9kYmdpbmZvKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKiBTZXR1cCB0aGUgZnVuY3Rpb24gcmVnaXN0cmF0aW9uIHRhYmxlIChhbmQgb3RoZXIgZGF0YSkgZm9yIGEKCSAqIG5ldF9kZXZpY2UKCSAqLwoJLy9uZXRkZXYtPmluaXQgICAgICAgICAgICAgICA9ICZldDEzMXhfaW5pdDsKCS8vbmV0ZGV2LT5zZXRfY29uZmlnID0gJmV0MTMxeF9jb25maWc7CgluZXRkZXYtPmdldF9zdGF0cyA9ICZldDEzMXhfc3RhdHM7CgluZXRkZXYtPm9wZW4gPSAmZXQxMzF4X29wZW47CgluZXRkZXYtPnN0b3AgPSAmZXQxMzF4X2Nsb3NlOwoJbmV0ZGV2LT5kb19pb2N0bCA9ICZldDEzMXhfaW9jdGw7CgluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZldDEzMXhfbXVsdGljYXN0OwoJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZXQxMzF4X3R4OwoJbmV0ZGV2LT50eF90aW1lb3V0ID0gJmV0MTMxeF90eF90aW1lb3V0OwoJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEVUMTMxWF9UWF9USU1FT1VUOwoJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmV0MTMxeF9jaGFuZ2VfbXR1OwoJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmZXQxMzF4X3NldF9tYWNfYWRkcjsKCgkvL25ldGRldi0+ZXRodG9vbF9vcHMgICAgICAgID0gJmV0MTMxeF9ldGh0b29sX29wczsKCgkvLyBQb2xsPwoJLy9uZXRkZXYtPnBvbGwgICAgICAgICAgICAgICA9ICZldDEzMXhfcG9sbDsKCS8vbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgICAgPSAmZXQxMzF4X3BvbGxfY29udHJvbGxlcjsKCglEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwoJcmV0dXJuIG5ldGRldjsKfQoKLyoqCiAqIGV0MTMxeF9zdGF0cyAtIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGlzdGljcy4KICogQG5ldGRldjogZGV2aWNlIHdob3NlIHN0YXRzIGFyZSBiZWluZyBxdWVyaWVkCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAqLwpzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXQxMzF4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCnsKCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CglzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmYWRhcHRlci0+bmV0X3N0YXRzOwoJQ0VfU1RBVFNfdCAqZGV2c3RhdCA9ICZhZGFwdGVyLT5TdGF0czsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCXN0YXRzLT5yeF9wYWNrZXRzID0gZGV2c3RhdC0+aXBhY2tldHM7CglzdGF0cy0+dHhfcGFja2V0cyA9IGRldnN0YXQtPm9wYWNrZXRzOwoJc3RhdHMtPnJ4X2Vycm9ycyA9IGRldnN0YXQtPmxlbmd0aF9lcnIgKyBkZXZzdGF0LT5hbGlnbm1lbnRfZXJyICsKCSAgICBkZXZzdGF0LT5jcmNfZXJyICsgZGV2c3RhdC0+Y29kZV92aW9sYXRpb25zICsgZGV2c3RhdC0+b3RoZXJfZXJyb3JzOwoJc3RhdHMtPnR4X2Vycm9ycyA9IGRldnN0YXQtPm1heF9wa3RfZXJyb3I7CglzdGF0cy0+bXVsdGljYXN0ID0gZGV2c3RhdC0+bXVsdGlyY3Y7CglzdGF0cy0+Y29sbGlzaW9ucyA9IGRldnN0YXQtPmNvbGxpc2lvbnM7CgoJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBkZXZzdGF0LT5sZW5ndGhfZXJyOwoJc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gZGV2c3RhdC0+cnhfb3ZfZmxvdzsKCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gZGV2c3RhdC0+Y3JjX2VycjsKCgkvLyBOT1RFOiBUaGVzZSBzdGF0cyBkb24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIENFX1NUQVRTLCBzbyB3ZSdyZQoJLy8gICAgICAgZ29pbmcgdG8gaGF2ZSB0byB1cGRhdGUgdGhlc2UgZGlyZWN0bHkgZnJvbSB3aXRoaW4gdGhlIFRYL1JYIGNvZGUKCS8vc3RhdHMtPnJ4X2J5dGVzICAgICAgICAgICAgPSAyMDsgLy9kZXZzdGF0LT47CgkvL3N0YXRzLT50eF9ieXRlcyAgICAgICAgICAgID0gMjA7IC8vZGV2c3RhdC0+OwoJLy9zdGF0cy0+cnhfZHJvcHBlZCAgICAgICAgICA9IGRldnN0YXQtPjsKCS8vc3RhdHMtPnR4X2Ryb3BwZWQgICAgICAgICAgPSBkZXZzdGF0LT47CgoJLy8gTk9URTogTm90IHVzZWQsIGNhbid0IGZpbmQgYW5hbG9nb3VzIHN0YXRpc3RpY3MKCS8vc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyAgICAgPSBkZXZzdGF0LT47CgkvL3N0YXRzLT5yeF9maWZvX2Vycm9ycyAgICAgID0gZGV2c3RhdC0+OwoJLy9zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyAgICA9IGRldnN0YXQtPjsKCgkvL3N0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyAgID0gZGV2c3RhdC0+OwoJLy9zdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgICA9IGRldnN0YXQtPjsKCS8vc3RhdHMtPnR4X2ZpZm9fZXJyb3JzICAgICAgPSBkZXZzdGF0LT47CgkvL3N0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzID0gZGV2c3RhdC0+OwoJLy9zdGF0cy0+dHhfd2luZG93X2Vycm9ycyAgICA9IGRldnN0YXQtPjsKCglEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwoJcmV0dXJuIHN0YXRzOwp9CgovKioKICogZXQxMzF4X29wZW4gLSBPcGVuIHRoZSBkZXZpY2UgZm9yIHVzZS4KICogQG5ldGRldjogZGV2aWNlIHRvIGJlIG9wZW5lZAogKgogKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogKi8KaW50IGV0MTMxeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCnsKCWludCByZXN1bHQgPSAwOwoJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCS8qIFN0YXJ0IHRoZSB0aW1lciB0byB0cmFjayBOSUMgZXJyb3JzICovCglhZGRfdGltZXIoJmFkYXB0ZXItPkVycm9yVGltZXIpOwoKCS8qIFJlZ2lzdGVyIG91ciBJU1IgKi8KCURCR19UUkFDRShldDEzMXhfZGJnaW5mbywgIlJlZ2lzdGVyaW5nIElTUi4uLlxuIik7CgoJcmVzdWx0ID0KCSAgICByZXF1ZXN0X2lycShuZXRkZXYtPmlycSwgZXQxMzF4X2lzciwgSVJRRl9TSEFSRUQsIG5ldGRldi0+bmFtZSwKCQkJbmV0ZGV2KTsKCWlmIChyZXN1bHQpIHsKCQlEQkdfRVJST1IoZXQxMzF4X2RiZ2luZm8sICJDb3VsZCBub3QgcmVnaXN0ZXIgSVNSXG4iKTsKCQlEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJLyogRW5hYmxlIHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQpICovCglldDEzMXhfcnhfZG1hX2VuYWJsZShhZGFwdGVyKTsKCWV0MTMxeF90eF9kbWFfZW5hYmxlKGFkYXB0ZXIpOwoKCS8qIEVuYWJsZSBkZXZpY2UgaW50ZXJydXB0cyAqLwoJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwoKCU1QX1NFVF9GTEFHKGFkYXB0ZXIsIGZNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOwoKCS8qIFdlJ3JlIHJlYWR5IHRvIG1vdmUgc29tZSBkYXRhLCBzbyBzdGFydCB0aGUgcXVldWUgKi8KCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CgoJREJHX0xFQVZFKGV0MTMxeF9kYmdpbmZvKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qKgogKiBldDEzMXhfY2xvc2UgLSBDbG9zZSB0aGUgZGV2aWNlCiAqIEBuZXRkZXY6IGRldmljZSB0byBiZSBjbG9zZWQKICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICovCmludCBldDEzMXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKewoJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCS8qIEZpcnN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIHF1ZXVlICovCgluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CgoJLyogU3RvcCB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzICovCglldDEzMXhfcnhfZG1hX2Rpc2FibGUoYWRhcHRlcik7CglldDEzMXhfdHhfZG1hX2Rpc2FibGUoYWRhcHRlcik7CgoJLyogRGlzYWJsZSBkZXZpY2UgaW50ZXJydXB0cyAqLwoJZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKCgkvKiBEZXJlZ2lzdGVyaW5nIElTUiAqLwoJTVBfQ0xFQVJfRkxBRyhhZGFwdGVyLCBmTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKCglEQkdfVFJBQ0UoZXQxMzF4X2RiZ2luZm8sICJEZXJlZ2lzdGVyaW5nIElTUi4uLlxuIik7CglmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKCgkvKiBTdG9wIHRoZSBlcnJvciB0aW1lciAqLwoJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPkVycm9yVGltZXIpOwoKCURCR19MRUFWRShldDEzMXhfZGJnaW5mbyk7CglyZXR1cm4gMDsKfQoKLyoqCiAqIGV0MTMxeF9pb2N0bF9taWkgLSBUaGUgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyBNSUkgSU9DVExzCiAqIEBuZXRkZXY6IGRldmljZSBvbiB3aGljaCB0aGUgcXVlcnkgaXMgYmVpbmcgbWFkZQogKiBAcmVxYnVmOiB0aGUgcmVxdWVzdC1zcGVjaWZpYyBkYXRhIGJ1ZmZlcgogKiBAY21kOiB0aGUgY29tbWFuZCByZXF1ZXN0IGNvZGUKICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICovCmludCBldDEzMXhfaW9jdGxfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcmVxYnVmLCBpbnQgY21kKQp7CglpbnQgc3RhdHVzID0gMDsKCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwoJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJlcWJ1Zik7CgoJREJHX0VOVEVSKGV0MTMxeF9kYmdpbmZvKTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBTSU9DR01JSVBIWToKCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywgIlNJT0NHTUlJUEhZXG4iKTsKCQlkYXRhLT5waHlfaWQgPSBwQWRhcHRlci0+U3RhdHMueGN2cl9hZGRyOwoJCWJyZWFrOwoKCWNhc2UgU0lPQ0dNSUlSRUc6CgkJREJHX1ZFUkJPU0UoZXQxMzF4X2RiZ2luZm8sICJTSU9DR01JSVJFR1xuIik7CgkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CgkJCXN0YXR1cyA9IC1FUEVSTTsKCQl9IGVsc2UgewoJCQlzdGF0dXMgPSBNaVJlYWQocEFkYXB0ZXIsCgkJCQkJZGF0YS0+cmVnX251bSwgJmRhdGEtPnZhbF9vdXQpOwoJCX0KCQlicmVhazsKCgljYXNlIFNJT0NTTUlJUkVHOgoJCURCR19WRVJCT1NFKGV0MTMxeF9kYmdpbmZvLCAiU0lPQ1NNSUlSRUdcbiIpOwoJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewoJCQlzdGF0dXMgPSAtRVBFUk07CgkJfSBlbHNlIHsKCQkJc3RhdHVzID0gTWlXcml0ZShwQWRhcHRlciwgZGF0YS0+cmVnX251bSwKCQkJCQkgZGF0YS0+dmFsX2luKTsKCQl9CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKCX0KCglEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwoJcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAqIGV0MTMxeF9pb2N0bCAtIFRoZSBJL08gQ29udHJvbCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyCiAqIEBuZXRkZXY6IGRldmljZSBvbiB3aGljaCB0aGUgY29udHJvbCByZXF1ZXN0IGlzIGJlaW5nIG1hZGUKICogQHJlcWJ1ZjogYSBwb2ludGVyIHRvIHRoZSBJT0NUTCByZXF1ZXN0IGJ1ZmZlcgogKiBAY21kOiB0aGUgSU9DVEwgY29tbWFuZCBjb2RlCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAqLwppbnQgZXQxMzF4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcmVxYnVmLCBpbnQgY21kKQp7CglpbnQgc3RhdHVzID0gMDsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIFNJT0NHTUlJUEhZOgoJY2FzZSBTSU9DR01JSVJFRzoKCWNhc2UgU0lPQ1NNSUlSRUc6CgkJc3RhdHVzID0gZXQxMzF4X2lvY3RsX21paShuZXRkZXYsIHJlcWJ1ZiwgY21kKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLCAiVW5oYW5kbGVkIElPQ1RMIENvZGU6IDB4JTA0eFxuIiwKCQkJICAgIGNtZCk7CgkJc3RhdHVzID0gLUVPUE5PVFNVUFA7Cgl9CgoJREJHX0xFQVZFKGV0MTMxeF9kYmdpbmZvKTsKCXJldHVybiBzdGF0dXM7Cn0KCi8qKgogKiBldDEzMXhfc2V0X3BhY2tldF9maWx0ZXIgLSBDb25maWd1cmVzIHRoZSBSeCBQYWNrZXQgZmlsdGVyaW5nIG9uIHRoZSBkZXZpY2UKICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUKICovCmludCBldDEzMXhfc2V0X3BhY2tldF9maWx0ZXIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQp7CglpbnQgc3RhdHVzID0gMDsKCXVpbnQzMl90IGZpbHRlciA9IGFkYXB0ZXItPlBhY2tldEZpbHRlcjsKCVJYTUFDX0NUUkxfdCBjdHJsOwoJUlhNQUNfUEZfQ1RSTF90IHBmX2N0cmw7CgoJREJHX0VOVEVSKGV0MTMxeF9kYmdpbmZvKTsKCgljdHJsLnZhbHVlID0gcmVhZGwoJmFkYXB0ZXItPkNTUkFkZHJlc3MtPnJ4bWFjLmN0cmwudmFsdWUpOwoJcGZfY3RybC52YWx1ZSA9IHJlYWRsKCZhZGFwdGVyLT5DU1JBZGRyZXNzLT5yeG1hYy5wZl9jdHJsLnZhbHVlKTsKCgkvKiBEZWZhdWx0IHRvIGRpc2FibGVkIHBhY2tldCBmaWx0ZXJpbmcuICBFbmFibGUgaXQgaW4gdGhlIGluZGl2aWR1YWwKCSAqIGNhc2Ugc3RhdGVtZW50cyB0aGF0IHJlcXVpcmUgdGhlIGRldmljZSB0byBmaWx0ZXIgc29tZXRoaW5nCgkgKi8KCWN0cmwuYml0cy5wa3RfZmlsdGVyX2Rpc2FibGUgPSAxOwoKCS8qIFNldCB1cyB0byBiZSBpbiBwcm9taXNjdW91cyBtb2RlIHNvIHdlIHJlY2VpdmUgZXZlcnl0aGluZywgdGhpcwoJICogaXMgYWxzbyB0cnVlIHdoZW4gd2UgZ2V0IGEgcGFja2V0IGZpbHRlciBvZiAwCgkgKi8KCWlmICgoZmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTKSB8fCBmaWx0ZXIgPT0gMCkgewoJCXBmX2N0cmwuYml0cy5maWx0ZXJfYnJvYWRfZW4gPSAwOwoJCXBmX2N0cmwuYml0cy5maWx0ZXJfbXVsdGlfZW4gPSAwOwoJCXBmX2N0cmwuYml0cy5maWx0ZXJfdW5pX2VuID0gMDsKCX0gZWxzZSB7CgkJLyoKCQkgKiBTZXQgdXMgdXAgd2l0aCBNdWx0aWNhc3QgcGFja2V0IGZpbHRlcmluZy4gIFRocmVlIGNhc2VzIGFyZQoJCSAqIHBvc3NpYmxlIC0gKDEpIHdlIGhhdmUgYSBtdWx0aS1jYXN0IGxpc3QsICgyKSB3ZSByZWNlaXZlIEFMTAoJCSAqIG11bHRpY2FzdCBlbnRyaWVzIG9yICgzKSB3ZSByZWNlaXZlIG5vbmUuCgkJICovCgkJaWYgKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUKSB7CgkJCURCR19WRVJCT1NFKGV0MTMxeF9kYmdpbmZvLAoJCQkJICAgICJNdWx0aWNhc3QgZmlsdGVyaW5nIE9GRiAoUnggQUxMIE1VTFRJQ0FTVClcbiIpOwoJCQlwZl9jdHJsLmJpdHMuZmlsdGVyX211bHRpX2VuID0gMDsKCQl9IGVsc2UgewoJCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywgIk11bHRpY2FzdCBmaWx0ZXJpbmcgT05cbiIpOwoJCQlTZXR1cERldmljZUZvck11bHRpY2FzdChhZGFwdGVyKTsKCQkJcGZfY3RybC5iaXRzLmZpbHRlcl9tdWx0aV9lbiA9IDE7CgkJCWN0cmwuYml0cy5wa3RfZmlsdGVyX2Rpc2FibGUgPSAwOwoJCX0KCgkJLyogU2V0IHVzIHVwIHdpdGggVW5pY2FzdCBwYWNrZXQgZmlsdGVyaW5nICovCgkJaWYgKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRCkgewoJCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywgIlVuaWNhc3QgRmlsdGVyaW5nIE9OXG4iKTsKCQkJU2V0dXBEZXZpY2VGb3JVbmljYXN0KGFkYXB0ZXIpOwoJCQlwZl9jdHJsLmJpdHMuZmlsdGVyX3VuaV9lbiA9IDE7CgkJCWN0cmwuYml0cy5wa3RfZmlsdGVyX2Rpc2FibGUgPSAwOwoJCX0KCgkJLyogU2V0IHVzIHVwIHdpdGggQnJvYWRjYXN0IHBhY2tldCBmaWx0ZXJpbmcgKi8KCQlpZiAoZmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCkgewoJCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywgIkJyb2FkY2FzdCBGaWx0ZXJpbmcgT05cbiIpOwoJCQlwZl9jdHJsLmJpdHMuZmlsdGVyX2Jyb2FkX2VuID0gMTsKCQkJY3RybC5iaXRzLnBrdF9maWx0ZXJfZGlzYWJsZSA9IDA7CgkJfSBlbHNlIHsKCQkJREJHX1ZFUkJPU0UoZXQxMzF4X2RiZ2luZm8sCgkJCQkgICAgIkJyb2FkY2FzdCBGaWx0ZXJpbmcgT0ZGXG4iKTsKCQkJcGZfY3RybC5iaXRzLmZpbHRlcl9icm9hZF9lbiA9IDA7CgkJfQoKCQkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBtYWMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgLSBQYWNrZXQKCQkgKiBGaWx0ZXIgY29udHJvbCArIHRoZSBlbmFibGUgLyBkaXNhYmxlIGZvciBwYWNrZXQgZmlsdGVyCgkJICogaW4gdGhlIGNvbnRyb2wgcmVnLgoJCSAqLwoJCXdyaXRlbChwZl9jdHJsLnZhbHVlLAoJCSAgICAgICAmYWRhcHRlci0+Q1NSQWRkcmVzcy0+cnhtYWMucGZfY3RybC52YWx1ZSk7CgkJd3JpdGVsKGN0cmwudmFsdWUsICZhZGFwdGVyLT5DU1JBZGRyZXNzLT5yeG1hYy5jdHJsLnZhbHVlKTsKCX0KCglEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwoJcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAqIGV0MTMxeF9tdWx0aWNhc3QgLSBUaGUgaGFuZGxlciB0byBjb25maWd1cmUgbXVsdGljYXN0aW5nIG9uIHRoZSBpbnRlcmZhY2UKICogQG5ldGRldjogYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UKICovCnZvaWQgZXQxMzF4X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQp7CglzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwoJdWludDMyX3QgUGFja2V0RmlsdGVyID0gMDsKCXVpbnQzMl90IGNvdW50OwoJdW5zaWduZWQgbG9uZyBsb2NrZmxhZ3M7CglzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5Mb2NrLCBsb2NrZmxhZ3MpOwoKCS8qIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGZpbHRlciBmbGFncywgc3RvcmUgdGhlbQoJICogbG9jYWxseS4gVGhpcyBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nJ3MgY2hhbmdlZCBhbmQgaWYKCSAqIHdlIGV2ZW4gbmVlZCB0byBib3RoZXIgdGhlIGhhcmR3YXJlCgkgKi8KCVBhY2tldEZpbHRlciA9IGFkYXB0ZXItPlBhY2tldEZpbHRlcjsKCgkvKiBDbGVhciB0aGUgJ211bHRpY2FzdCcgZmxhZyBsb2NhbGx5OyBiZWN1YXNlIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZQoJICogZmxhZyB0byBjaGVjayBtdWx0aWNhc3QsIGFuZCBtdWx0aXBsZSBtdWx0aWNhc3QgYWRkcmVzc2VzIGNhbiBiZQoJICogc2V0LCB0aGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBkZXRlcm1pbmUgaWYgbW9yZSB0aGFuIG9uZQoJICogbXVsdGljYXN0IGFkZHJlc3MgaXMgYmVpbmcgc2V0LgoJICovCglQYWNrZXRGaWx0ZXIgJj0gfkVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1Q7CgoJLyogQ2hlY2sgdGhlIG5ldF9kZXZpY2UgZmxhZ3MgYW5kIHNldCB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGZsYWdzCgkgKiBhY2NvcmRpbmdseQoJICovCglEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywKCQkgICAgIk1VTFRJQ0FTVCBBRERSIENPVU5UOiAlZFxuIiwgbmV0ZGV2LT5tY19jb3VudCk7CgoJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewoJCURCR19WRVJCT1NFKGV0MTMxeF9kYmdpbmZvLCAiUmVxdWVzdDogUFJPTUlTQ1VPVVMgTU9ERSBPTlxuIik7CgkJYWRhcHRlci0+UGFja2V0RmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUzsKCX0gZWxzZSB7CgkJREJHX1ZFUkJPU0UoZXQxMzF4X2RiZ2luZm8sICJSZXF1ZXN0OiBQUk9NSVNDVU9VUyBNT0RFIE9GRlxuIik7CgkJYWRhcHRlci0+UGFja2V0RmlsdGVyICY9IH5FVDEzMVhfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVM7Cgl9CgoJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywgIlJlcXVlc3Q6IEFDQ0VQVCBBTEwgTVVMVElDQVNUXG4iKTsKCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgfD0gRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1Q7Cgl9CgoJaWYgKG5ldGRldi0+bWNfY291bnQgPiBOSUNfTUFYX01DQVNUX0xJU1QpIHsKCQlEQkdfV0FSTklORyhldDEzMXhfZGJnaW5mbywKCQkJICAgICJBQ0NFUFQgQUxMIE1VTFRJQ0FTVCBmb3Igbm93LCBhcyB0aGVyZSdzIG1vcmUgTXVsdGljYXN0ICIKCQkJICAgICJhZGRyZXNzZXMgdGhhbiB0aGUgSFcgc3VwcG9ydHNcbiIpOwoKCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgfD0gRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1Q7Cgl9CgoJaWYgKG5ldGRldi0+bWNfY291bnQgPCAxKSB7CgkJREJHX1ZFUkJPU0UoZXQxMzF4X2RiZ2luZm8sICJSZXF1ZXN0OiBSRUpFQ1QgQUxMIE1VTFRJQ0FTVFxuIik7CgkJYWRhcHRlci0+UGFja2V0RmlsdGVyICY9IH5FVDEzMVhfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVDsKCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgJj0gfkVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1Q7Cgl9IGVsc2UgewoJCURCR19WRVJCT1NFKGV0MTMxeF9kYmdpbmZvLAoJCQkgICAgIlJlcXVlc3Q6IFNFVCBNVUxUSUNBU1QgRklMVEVSKFMpXG4iKTsKCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgfD0gRVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVDsKCX0KCgkvKiBTZXQgdmFsdWVzIGluIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCglhZGFwdGVyLT5NQ0FkZHJlc3NDb3VudCA9IG5ldGRldi0+bWNfY291bnQ7CgoJaWYgKG5ldGRldi0+bWNfY291bnQpIHsKCQlpZiAobWNsaXN0LT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTikgewoJCQlEQkdfV0FSTklORyhldDEzMXhfZGJnaW5mbywKCQkJCSAgICAiTXVsdGljYXN0IGFkZHJzIGFyZSBub3QgRVRIX0FMRU4gaW4gc2l6ZVxuIik7CgkJfSBlbHNlIHsKCQkJY291bnQgPSBuZXRkZXYtPm1jX2NvdW50IC0gMTsKCQkJbWVtY3B5KGFkYXB0ZXItPk1DTGlzdFtjb3VudF0sIG1jbGlzdC0+ZG1pX2FkZHIsCgkJCSAgICAgICBFVEhfQUxFTik7CgkJfQoJfQoKCS8qIEFyZSB0aGUgbmV3IGZsYWdzIGRpZmZlcmVudCBmcm9tIHRoZSBwcmV2aW91cyBvbmVzPyBJZiBub3QsIHRoZW4gbm8KCSAqIGFjdGlvbiBpcyByZXF1aXJlZAoJICoKCSAqIE5PVEUgLSBUaGlzIGJsb2NrIHdpbGwgYWx3YXlzIHVwZGF0ZSB0aGUgTUNMaXN0IHdpdGggdGhlIGhhcmR3YXJlLAoJICogICAgICAgIGV2ZW4gaWYgdGhlIGFkZHJlc3NlcyBhcmVuJ3QgdGhlIHNhbWUuCgkgKi8KCWlmIChQYWNrZXRGaWx0ZXIgIT0gYWRhcHRlci0+UGFja2V0RmlsdGVyKSB7CgkJLyogQ2FsbCB0aGUgZGV2aWNlJ3MgZmlsdGVyIGZ1bmN0aW9uICovCgkJREJHX1ZFUkJPU0UoZXQxMzF4X2RiZ2luZm8sICJVUERBVEUgUkVRVUlSRUQsIEZMQUdTIGNoYW5nZWRcbiIpOwoKCQlldDEzMXhfc2V0X3BhY2tldF9maWx0ZXIoYWRhcHRlcik7Cgl9IGVsc2UgewoJCURCR19WRVJCT1NFKGV0MTMxeF9kYmdpbmZvLAoJCQkgICAgIk5PIFVQREFURSBSRVFVSVJFRCwgRkxBR1MgZGlkbid0IGNoYW5nZVxuIik7Cgl9CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+TG9jaywgbG9ja2ZsYWdzKTsKCglEQkdfTEVBVkUoZXQxMzF4X2RiZ2luZm8pOwp9CgovKioKICogZXQxMzF4X3R4IC0gVGhlIGhhbmRsZXIgdG8gdHggYSBwYWNrZXQgb24gdGhlIGRldmljZQogKiBAc2tiOiBkYXRhIHRvIGJlIFR4J2QKICogQG5ldGRldjogZGV2aWNlIG9uIHdoaWNoIGRhdGEgaXMgdG8gYmUgVHgnZAogKgogKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogKi8KaW50IGV0MTMxeF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQp7CglpbnQgc3RhdHVzID0gMDsKCglEQkdfVFhfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCS8qIFNhdmUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIFRYIHRpbWVvdXQgd2F0Y2hkb2cgKi8KCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwoKCS8qIENhbGwgdGhlIGRldmljZS1zcGVjaWZpYyBkYXRhIFR4IHJvdXRpbmUgKi8KCXN0YXR1cyA9IGV0MTMxeF9zZW5kX3BhY2tldHMoc2tiLCBuZXRkZXYpOwoKCS8qIENoZWNrIHN0YXR1cyBhbmQgbWFuYWdlIHRoZSBuZXRpZiBxdWV1ZSBpZiBuZWNlc3NhcnkgKi8KCWlmIChzdGF0dXMgIT0gMCkgewoJCWlmIChzdGF0dXMgPT0gLUVOT01FTSkgewoJCQlEQkdfVkVSQk9TRShldDEzMXhfZGJnaW5mbywKCQkJCSAgICAiT1VUIE9GIFRDQnM7IFNUT1AgTkVUSUYgUVVFVUVcbiIpOwoKCQkJLyogUHV0IHRoZSBxdWV1ZSB0byBzbGVlcCB1bnRpbCByZXNvdXJjZXMgYXJlCgkJCSAqIGF2YWlsYWJsZQoJCQkgKi8KCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwoJCQlzdGF0dXMgPSAxOwoJCX0gZWxzZSB7CgkJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLAoJCQkJICAgICJNaXNjIGVycm9yOyBkcm9wIHBhY2tldFxuIik7CgkJCXN0YXR1cyA9IDA7CgkJfQoJfQoKCURCR19UWF9MRUFWRShldDEzMXhfZGJnaW5mbyk7CglyZXR1cm4gc3RhdHVzOwp9CgovKioKICogZXQxMzF4X3R4X3RpbWVvdXQgLSBUaW1lb3V0IGhhbmRsZXIKICogQG5ldGRldjogYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UKICoKICogVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBUeCByZXF1ZXN0IHRpbWVzIG91dC4gVGhlIHRpbWVvdXQgcGVyaW9kIGlzCiAqIHNwZWNpZmllZCBieSB0aGUgJ3R4X3RpbWVvIiBlbGVtZW50IGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSAoc2VlCiAqIGV0MTMxeF9hbGxvY19kZXZpY2UoKSB0byBzZWUgaG93IHRoaXMgdmFsdWUgaXMgc2V0KS4KICovCnZvaWQgZXQxMzF4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKewoJc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CglQTVBfVENCIHBNcFRjYjsKCXVuc2lnbmVkIGxvbmcgbG9ja2ZsYWdzOwoKCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLCAiVFggVElNRU9VVFxuIik7CgoJLyogSnVzdCBza2lwIHRoaXMgcGFydCBpZiB0aGUgYWRhcHRlciBpcyBkb2luZyBsaW5rIGRldGVjdGlvbiAqLwoJaWYgKE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZk1QX0FEQVBURVJfTElOS19ERVRFQ1RJT04pKSB7CgkJREJHX0VSUk9SKGV0MTMxeF9kYmdpbmZvLCAiU3RpbGwgZG9pbmcgbGluayBkZXRlY3Rpb25cbiIpOwoJCXJldHVybjsKCX0KCgkvKiBBbnkgbm9ucmVjb3ZlcmFibGUgaGFyZHdhcmUgZXJyb3I/CgkgKiBDaGVja3MgYWRhcHRlci0+ZmxhZ3MgZm9yIGFueSBmYWlsdXJlIGluIHBoeSByZWFkaW5nCgkgKi8KCWlmIChNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZNUF9BREFQVEVSX05PTl9SRUNPVkVSX0VSUk9SKSkgewoJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLCAiTm9uIHJlY292ZXJhYmxlIGVycm9yIC0gcmVtb3ZlXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogSGFyZHdhcmUgZmFpbHVyZT8gKi8KCWlmIChNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKSkgewoJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLCAiaGFyZHdhcmUgZXJyb3IgLSByZXNldFxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIElzIHNlbmQgc3R1Y2s/ICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcEFkYXB0ZXItPlRDQlNlbmRRTG9jaywgbG9ja2ZsYWdzKTsKCglwTXBUY2IgPSBwQWRhcHRlci0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKCglpZiAocE1wVGNiICE9IE5VTEwpIHsKCQlwTXBUY2ItPkNvdW50Kys7CgoJCWlmIChwTXBUY2ItPkNvdW50ID4gTklDX1NFTkRfSEFOR19USFJFU0hPTEQpIHsKI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKCQkJVFhfU1RBVFVTX0JMT0NLX3QgdHhEbWFDb21wbGV0ZSA9CgkJCSAgICAqKHBBZGFwdGVyLT5UeFJpbmcucFR4U3RhdHVzVmEpOwoJCQlQVFhfREVTQ19FTlRSWV90IHBEZXNjID0KCQkJICAgIHBBZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdWYSArCgkJCSAgICBwTXBUY2ItPldySW5kZXguYml0cy52YWw7CiNlbmRpZgoJCQlUWF9ERVNDX0VOVFJZX3QgU3R1Y2tEZXNjcmlwdG9yc1sxMF07CgoJCQlpZiAocE1wVGNiLT5XckluZGV4LmJpdHMudmFsID4gNykgewoJCQkJbWVtY3B5KFN0dWNrRGVzY3JpcHRvcnMsCgkJCQkgICAgICAgcEFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhICsKCQkJCSAgICAgICBwTXBUY2ItPldySW5kZXguYml0cy52YWwgLSA2LAoJCQkJICAgICAgIHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogMTApOwoJCQl9CgoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQWRhcHRlci0+VENCU2VuZFFMb2NrLAoJCQkJCSAgICAgICBsb2NrZmxhZ3MpOwoKCQkJREJHX1dBUk5JTkcoZXQxMzF4X2RiZ2luZm8sCgkJCQkgICAgIlNlbmQgc3R1Y2sgLSByZXNldC4gIHBNcFRjYi0+V3JJbmRleCAleCwgRmxhZ3MgMHglMDh4XG4iLAoJCQkJICAgIHBNcFRjYi0+V3JJbmRleC5iaXRzLnZhbCwKCQkJCSAgICBwTXBUY2ItPkZsYWdzKTsKCgkJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLAoJCQkJICAgICJwRGVzYyAweCUwOHgsIDB4JTA4eCwgMHglMDh4LCAweCUwOHhcbiIsCgkJCQkgICAgcERlc2MtPkRhdGFCdWZmZXJQdHJIaWdoLAoJCQkJICAgIHBEZXNjLT5EYXRhQnVmZmVyUHRyTG93LCBwRGVzYy0+d29yZDIudmFsdWUsCgkJCQkgICAgcERlc2MtPndvcmQzLnZhbHVlKTsKCgkJCURCR19XQVJOSU5HKGV0MTMxeF9kYmdpbmZvLAoJCQkJICAgICJXYlN0YXR1cyAweCUwOHhcbiIsIHR4RG1hQ29tcGxldGUudmFsdWUpOwoKI2lmZGVmIENPTkZJR19FVDEzMVhfREVCVUcKCQkJRHVtcERldmljZUJsb2NrKERCR19XQVJOSU5HX09OLCBwQWRhcHRlciwgMCk7CgkJCUR1bXBEZXZpY2VCbG9jayhEQkdfV0FSTklOR19PTiwgcEFkYXB0ZXIsIDEpOwoJCQlEdW1wRGV2aWNlQmxvY2soREJHX1dBUk5JTkdfT04sIHBBZGFwdGVyLCAzKTsKCQkJRHVtcERldmljZUJsb2NrKERCR19XQVJOSU5HX09OLCBwQWRhcHRlciwgNSk7CiNlbmRpZgoJCQlldDEzMXhfY2xvc2UobmV0ZGV2KTsKCQkJZXQxMzF4X29wZW4obmV0ZGV2KTsKCgkJCXJldHVybjsKCQl9Cgl9CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFkYXB0ZXItPlRDQlNlbmRRTG9jaywgbG9ja2ZsYWdzKTsKfQoKLyoqCiAqIGV0MTMxeF9jaGFuZ2VfbXR1IC0gVGhlIGhhbmRsZXIgY2FsbGVkIHRvIGNoYW5nZSB0aGUgTVRVIGZvciB0aGUgZGV2aWNlCiAqIEBuZXRkZXY6IGRldmljZSB3aG9zZSBNVFUgaXMgdG8gYmUgY2hhbmdlZAogKiBAbmV3X210dTogdGhlIGRlc2lyZWQgTVRVCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAqLwppbnQgZXQxMzF4X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCnsKCWludCByZXN1bHQgPSAwOwoJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoKCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIE1UVSBpcyB2YWxpZCAqLwoJaWYgKG5ld19tdHUgPT0gMCB8fCBuZXdfbXR1ID4gOTIxNikgewoJCURCR19MRUFWRShldDEzMXhfZGJnaW5mbyk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogU3RvcCB0aGUgbmV0aWYgcXVldWUgKi8KCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKCgkvKiBTdG9wIHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKi8KCWV0MTMxeF9yeF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKCWV0MTMxeF90eF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKCgkvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCglldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwoJZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChhZGFwdGVyKTsKCWV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoYWRhcHRlcik7CgoJLyogU2V0IHRoZSBuZXcgTVRVICovCgluZXRkZXYtPm10dSA9IG5ld19tdHU7CgoJLyogRnJlZSBSeCBETUEgbWVtb3J5ICovCglldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKCgkvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbWV0ZXIgZm9yIEp1bWJvIFBhY2tldCBzdXBwb3J0ICovCglhZGFwdGVyLT5SZWdpc3RyeUp1bWJvUGFja2V0ID0gbmV3X210dSArIDE0OwoJZXQxMzF4X3NvZnRfcmVzZXQoYWRhcHRlcik7CgoJLyogQWxsb2MgYW5kIGluaXQgUnggRE1BIG1lbW9yeSAqLwoJcmVzdWx0ID0gZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwoJaWYgKHJlc3VsdCAhPSAwKSB7CgkJREJHX1dBUk5JTkcoZXQxMzF4X2RiZ2luZm8sCgkJCSAgICAiQ2hhbmdlIE1UVSBmYWlsZWQ7IGNvdWxkbid0IHJlLWFsbG9jIERNQSBtZW1vcnlcbiIpOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKCglldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhhZGFwdGVyKTsKCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwoKCS8qIEluaXQgdGhlIGRldmljZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOwoKCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCglpZiAoTVBfVEVTVF9GTEFHKGFkYXB0ZXIsIGZNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CgkJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwoJfQoKCS8qIFJlc3RhcnQgdGhlIFR4IGFuZCBSeCBETUEgZW5naW5lcyAqLwoJZXQxMzF4X3J4X2RtYV9lbmFibGUoYWRhcHRlcik7CglldDEzMXhfdHhfZG1hX2VuYWJsZShhZGFwdGVyKTsKCgkvKiBSZXN0YXJ0IHRoZSBuZXRpZiBxdWV1ZSAqLwoJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwoKCURCR19MRUFWRShldDEzMXhfZGJnaW5mbyk7CglyZXR1cm4gcmVzdWx0Owp9CgovKioKICogZXQxMzF4X3NldF9tYWNfYWRkciAtIGhhbmRsZXIgdG8gY2hhbmdlIHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhlIGRldmljZQogKiBAbmV0ZGV2OiBkZXZpY2Ugd2hvc2UgTUFDIGlzIHRvIGJlIGNoYW5nZWQKICogQG5ld19tYWM6IHRoZSBkZXNpcmVkIE1BQyBhZGRyZXNzCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAqCiAqIElNUExFTUVOVEVEIEJZIDogYmx1eCBodHRwOi8vYmVybmRsdXguZGUgMjIuMDEuMjAwNyAyMToxNAogKi8KaW50IGV0MTMxeF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqbmV3X21hYykKewoJaW50IHJlc3VsdCA9IDA7CglzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwoJc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gbmV3X21hYzsKCglEQkdfRU5URVIoZXQxMzF4X2RiZ2luZm8pOwoJLy8gYmVnaW4gYmx1eAoJLy8gREJHX1ZFUkJPU0UoIGV0MTMxeF9kYmdpbmZvLCAiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkISFcbiIgKTsKCglpZiAoYWRhcHRlciA9PSBOVUxMKSB7CgkJREJHX0xFQVZFKGV0MTMxeF9kYmdpbmZvKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3RlZCBNQUMgaXMgdmFsaWQgKi8KCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyZXNzLT5zYV9kYXRhKSkgewoJCURCR19MRUFWRShldDEzMXhfZGJnaW5mbyk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogU3RvcCB0aGUgbmV0aWYgcXVldWUgKi8KCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKCgkvKiBTdG9wIHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKi8KCWV0MTMxeF9yeF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKCWV0MTMxeF90eF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKCgkvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCglldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwoJZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChhZGFwdGVyKTsKCWV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoYWRhcHRlcik7CgoJLyogU2V0IHRoZSBuZXcgTUFDICovCgkvLyBuZXRkZXYtPnNldF9tYWNfYWRkcmVzcyAgPSAmbmV3X21hYzsKCS8vIG5ldGRldi0+bXR1ID0gbmV3X210dTsKCgltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkcmVzcy0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CgoJcHJpbnRrKCIlczogU2V0dGluZyBNQUMgYWRkcmVzcyB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKCSAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldi0+ZGV2X2FkZHJbMF0sIG5ldGRldi0+ZGV2X2FkZHJbMV0sCgkgICAgICAgbmV0ZGV2LT5kZXZfYWRkclsyXSwgbmV0ZGV2LT5kZXZfYWRkclszXSwgbmV0ZGV2LT5kZXZfYWRkcls0XSwKCSAgICAgICBuZXRkZXYtPmRldl9hZGRyWzVdKTsKCgkvKiBGcmVlIFJ4IERNQSBtZW1vcnkgKi8KCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwoKCS8qIFNldCB0aGUgY29uZmlnIHBhcmFtZXRlciBmb3IgSnVtYm8gUGFja2V0IHN1cHBvcnQgKi8KCS8vIGFkYXB0ZXItPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPSBuZXdfbXR1ICsgMTQ7CgkvLyBibHV4OiBub3QgbmVlZGV0IGhlcmUsIHcnbGwgY2hhbmdlIHRoZSBNQUMKCglldDEzMXhfc29mdF9yZXNldChhZGFwdGVyKTsKCgkvKiBBbGxvYyBhbmQgaW5pdCBSeCBETUEgbWVtb3J5ICovCglyZXN1bHQgPSBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CglpZiAocmVzdWx0ICE9IDApIHsKCQlEQkdfV0FSTklORyhldDEzMXhfZGJnaW5mbywKCQkJICAgICJDaGFuZ2UgTUFDIGZhaWxlZDsgY291bGRuJ3QgcmUtYWxsb2MgRE1BIG1lbW9yeVxuIik7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwoKCWV0MTMxeF9zZXR1cF9oYXJkd2FyZV9wcm9wZXJ0aWVzKGFkYXB0ZXIpOwoJLy8gbWVtY3B5KCBuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4gKTsKCS8vIGJsdXg6IG5vLCBkbyBub3Qgb3ZlcnJpZGUgb3VyIG5pY2UgYWRkcmVzcwoKCS8qIEluaXQgdGhlIGRldmljZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOwoKCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCglpZiAoTVBfVEVTVF9GTEFHKGFkYXB0ZXIsIGZNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CgkJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwoJfQoKCS8qIFJlc3RhcnQgdGhlIFR4IGFuZCBSeCBETUEgZW5naW5lcyAqLwoJZXQxMzF4X3J4X2RtYV9lbmFibGUoYWRhcHRlcik7CglldDEzMXhfdHhfZG1hX2VuYWJsZShhZGFwdGVyKTsKCgkvKiBSZXN0YXJ0IHRoZSBuZXRpZiBxdWV1ZSAqLwoJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwoKCURCR19MRUFWRShldDEzMXhfZGJnaW5mbyk7CglyZXR1cm4gcmVzdWx0Owp9Cg==