LyoKICogIEFtaWdhIExpbnV4L202OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKICoKICogIKkgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gKGdlZXJ0QGxpbnV4LW02OGsub3JnKQogKgkJCSAgICAgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKQogKgogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24KICoKICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCiAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCiAqCiAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCiAqCQkJUHVibGljYXRpb24gIzE2OTA3LCBSZXYuIEIsIEFtZW5kbWVudC8wLCBNYXkgMTk5NAogKgogKglNQzY4MjMwOglQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgKFBJL1QpCiAqCQkJTW90b3JvbGEgU2VtaWNvbmR1Y3RvcnMsIERlY2VtYmVyLCAxOTgzCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eAogKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoZSBBcmlhZG5lIGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBWaWxsYWdlIFRyb25pYy4gSXQgY29udGFpbnM6CiAqCiAqCS0gYW4gQW03OUM5NjAgUENuZXQtSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBib3RoCiAqCSAgMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIDEwQkFTRS1UIChVVFApIGNvbm5lY3RvcnMKICoKICoJLSBhbiBNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lciBjb25maWd1cmVkIGFzIDIgcGFyYWxsZWwgcG9ydHMKICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvem9ycm8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgoKI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CgojaW5jbHVkZSAiYXJpYWRuZS5oIgoKCiNpZmRlZiBBUklBRE5FX0RFQlVHCmludCBhcmlhZG5lX2RlYnVnID0gQVJJQURORV9ERUJVRzsKI2Vsc2UKaW50IGFyaWFkbmVfZGVidWcgPSAxOwojZW5kaWYKCgogICAgLyoKICAgICAqCU1hY3JvcyB0byBGaXggRW5kaWFubmVzcyBwcm9ibGVtcwogICAgICovCgoJCQkJLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCiNkZWZpbmUgc3dhcHcoeCkJKCgoeD4+OCkmMHgwMGZmKXwoKHg8PDgpJjB4ZmYwMCkpCgkJCQkvKiBHZXQgdGhlIExvdyBCWVRFIGluIGEgV09SRCAqLwojZGVmaW5lIGxvd2IoeCkJCSh4JjB4ZmYpCgkJCQkvKiBHZXQgdGhlIFN3YXBwZWQgSGlnaCBXT1JEIGluIGEgTE9ORyAqLwojZGVmaW5lIHN3aGlnaHcoeCkJKCgoKHgpPj44KSYweGZmMDApfCgoKHgpPj4yNCkmMHgwMGZmKSkKCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBMb3cgV09SRCBpbiBhIExPTkcgKi8KI2RlZmluZSBzd2xvd3coeCkJKCgoKHgpPDw4KSYweGZmMDApfCgoKHgpPj44KSYweDAwZmYpKQoKCiAgICAvKgogICAgICoJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCiAgICAgKi8KCiNkZWZpbmUgVFhfUklOR19TSVpFCTUKI2RlZmluZSBSWF9SSU5HX1NJWkUJMTYKCiNkZWZpbmUgUEtUX0JVRl9TSVpFCTE1MjAKCgogICAgLyoKICAgICAqCVByaXZhdGUgRGV2aWNlIERhdGEKICAgICAqLwoKc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSB7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdHhfcmluZ1tUWF9SSU5HX1NJWkVdOwogICAgdm9sYXRpbGUgc3RydWN0IFJEUkUgKnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnR4X2J1ZmZbVFhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnJ4X2J1ZmZbUlhfUklOR19TSVpFXTsKICAgIGludCBjdXJfdHgsIGN1cl9yeDsJCQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KICAgIGludCBkaXJ0eV90eDsJCQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLwogICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgICBjaGFyIHR4X2Z1bGw7Cn07CgoKICAgIC8qCiAgICAgKglTdHJ1Y3R1cmUgQ3JlYXRlZCBpbiB0aGUgQXJpYWRuZSdzIFJBTSBCdWZmZXIKICAgICAqLwoKc3RydWN0IGxhbmNlZGF0YSB7CiAgICBzdHJ1Y3QgVERSRSB0eF9yaW5nW1RYX1JJTkdfU0laRV07CiAgICBzdHJ1Y3QgUkRSRSByeF9yaW5nW1JYX1JJTkdfU0laRV07CiAgICB1X3Nob3J0IHR4X2J1ZmZbVFhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUvc2l6ZW9mKHVfc2hvcnQpXTsKICAgIHVfc2hvcnQgcnhfYnVmZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOwp9OwoKc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBpcnFyZXR1cm5fdCBhcmlhZG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwpzdGF0aWMgaW50IGFyaWFkbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiNpZmRlZiBIQVZFX01VTFRJQ0FTVApzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiNlbmRpZgoKCnN0YXRpYyB2b2lkIG1lbWNweXcodm9sYXRpbGUgdV9zaG9ydCAqZGVzdCwgdV9zaG9ydCAqc3JjLCBpbnQgbGVuKQp7CiAgICB3aGlsZSAobGVuID49IDIpIHsKCSooZGVzdCsrKSA9ICooc3JjKyspOwoJbGVuIC09IDI7CiAgICB9CiAgICBpZiAobGVuID09IDEpCgkqZGVzdCA9ICgqKHVfY2hhciAqKXNyYyk8PDg7Cn0KCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhcmlhZG5lX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCgkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpOwpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXJpYWRuZV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOwoKCnN0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIGFyaWFkbmVfem9ycm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKICAgIHsgWk9SUk9fUFJPRF9WSUxMQUdFX1RST05JQ19BUklBRE5FIH0sCiAgICB7IDAgfQp9OwoKc3RhdGljIHN0cnVjdCB6b3Jyb19kcml2ZXIgYXJpYWRuZV9kcml2ZXIgPSB7CiAgICAubmFtZQk9ICJhcmlhZG5lIiwKICAgIC5pZF90YWJsZQk9IGFyaWFkbmVfem9ycm9fdGJsLAogICAgLnByb2JlCT0gYXJpYWRuZV9pbml0X29uZSwKICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcChhcmlhZG5lX3JlbW92ZV9vbmUpLAp9OwoKc3RhdGljIGludCBfX2RldmluaXQgYXJpYWRuZV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAoJCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KQp7CiAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CiAgICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IGJvYXJkK0FSSUFETkVfTEFOQ0U7CiAgICB1bnNpZ25lZCBsb25nIG1lbV9zdGFydCA9IGJvYXJkK0FSSUFETkVfUkFNOwogICAgc3RydWN0IHJlc291cmNlICpyMSwgKnIyOwogICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CiAgICBpbnQgZXJyOwoKICAgIHIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCksICJBbTc5Qzk2MCIpOwogICAgaWYgKCFyMSkKCXJldHVybiAtRUJVU1k7CiAgICByMiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUsICJSQU0iKTsKICAgIGlmICghcjIpIHsKCXJlbGVhc2VfcmVzb3VyY2UocjEpOwoJcmV0dXJuIC1FQlVTWTsKICAgIH0KCiAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSkpOwogICAgaWYgKGRldiA9PSBOVUxMKSB7CglyZWxlYXNlX3Jlc291cmNlKHIxKTsKCXJlbGVhc2VfcmVzb3VyY2UocjIpOwoJcmV0dXJuIC1FTk9NRU07CiAgICB9CgogICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwogICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgogICAgcjEtPm5hbWUgPSBkZXYtPm5hbWU7CiAgICByMi0+bmFtZSA9IGRldi0+bmFtZTsKCiAgICBkZXYtPmRldl9hZGRyWzBdID0gMHgwMDsKICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDYwOwogICAgZGV2LT5kZXZfYWRkclsyXSA9IDB4MzA7CiAgICBkZXYtPmRldl9hZGRyWzNdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjE2KSAmIDB4ZmY7CiAgICBkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKICAgIGRldi0+ZGV2X2FkZHJbNV0gPSB6LT5yb20uZXJfU2VyaWFsTnVtYmVyICYgMHhmZjsKICAgIGRldi0+YmFzZV9hZGRyID0gWlRXT19WQUREUihiYXNlX2FkZHIpOwogICAgZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CiAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCtBUklBRE5FX1JBTV9TSVpFOwoKICAgIGRldi0+b3BlbiA9ICZhcmlhZG5lX29wZW47CiAgICBkZXYtPnN0b3AgPSAmYXJpYWRuZV9jbG9zZTsKICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFyaWFkbmVfc3RhcnRfeG1pdDsKICAgIGRldi0+dHhfdGltZW91dCA9ICZhcmlhZG5lX3R4X3RpbWVvdXQ7CiAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKICAgIGRldi0+Z2V0X3N0YXRzID0gJmFyaWFkbmVfZ2V0X3N0YXRzOwogICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwoKICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogICAgaWYgKGVycikgewoJcmVsZWFzZV9yZXNvdXJjZShyMSk7CglyZWxlYXNlX3Jlc291cmNlKHIyKTsKCWZyZWVfbmV0ZGV2KGRldik7CglyZXR1cm4gZXJyOwogICAgfQogICAgem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKCiAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXJpYWRuZSBhdCAweCUwOGx4LCBFdGhlcm5ldCBBZGRyZXNzICIKCSAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgZGV2LT5uYW1lLCBib2FyZCwKCSAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCgkgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgYXJpYWRuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKICAgIHVfc2hvcnQgaW47CiAgICB1X2xvbmcgdmVyc2lvbjsKICAgIGludCBpOwoKICAgIC8qIFJlc2V0IHRoZSBMQU5DRSAqLwogICAgaW4gPSBsYW5jZS0+UmVzZXQ7CgogICAgLyogU3RvcCB0aGUgTEFOQ0UgKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCiAgICBsYW5jZS0+UkRQID0gU1RPUDsKCiAgICAvKiBDaGVjayB0aGUgTEFOQ0UgdmVyc2lvbiAqLwogICAgbGFuY2UtPlJBUCA9IENTUjg4OwkJLyogQ2hpcCBJRCAqLwogICAgdmVyc2lvbiA9IHN3YXB3KGxhbmNlLT5SRFApOwogICAgbGFuY2UtPlJBUCA9IENTUjg5OwkJLyogQ2hpcCBJRCAqLwogICAgdmVyc2lvbiB8PSBzd2FwdyhsYW5jZS0+UkRQKTw8MTY7CiAgICBpZiAoKHZlcnNpb24gJiAweDAwMDAwZmZmKSAhPSAweDAwMDAwMDAzKSB7CglwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX29wZW46IENvdWxkbid0IGZpbmQgQU1EIEV0aGVybmV0IENoaXBcbiIpOwoJcmV0dXJuIC1FQUdBSU47CiAgICB9CiAgICBpZiAoKHZlcnNpb24gJiAweDBmZmZmMDAwKSAhPSAweDAwMDAzMDAwKSB7CglwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX29wZW46IENvdWxkbid0IGZpbmQgQW03OUM5NjAgKFdyb25nIHBhcnQgIgoJICAgICAgICJudW1iZXIgPSAlbGQpXG4iLCAodmVyc2lvbiAmIDB4MGZmZmYwMDApPj4xMik7CglyZXR1cm4gLUVBR0FJTjsKICAgIH0KI2lmIDAKICAgIHByaW50ayhLRVJOX0RFQlVHICJhcmlhZG5lX29wZW46IEFtNzlDOTYwIChQQ25ldC1JU0EpIFJldmlzaW9uICVsZFxuIiwKCSAgICh2ZXJzaW9uICYgMHhmMDAwMDAwMCk+PjI4KTsKI2VuZGlmCgogICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKCiAgICAvKiBNaXNjZWxsYW5lb3VzIFN0dWZmICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMzsJCS8qIEludGVycnVwdCBNYXNrcyBhbmQgRGVmZXJyYWwgQ29udHJvbCAqLwogICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKICAgIGxhbmNlLT5SQVAgPSBDU1I0OwkJLyogVGVzdCBhbmQgRmVhdHVyZXMgQ29udHJvbCAqLwogICAgbGFuY2UtPlJEUCA9IERQT0xMfEFQQURfWE1UfE1GQ09NfFJDVkNDT018VFhTVFJUTXxKQUJNOwoKICAgIC8qIFNldCB0aGUgTXVsdGljYXN0IFRhYmxlICovCiAgICBsYW5jZS0+UkFQID0gQ1NSODsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzE1OjBdICovCiAgICBsYW5jZS0+UkRQID0gMHgwMDAwOwogICAgbGFuY2UtPlJBUCA9IENTUjk7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlszMToxNl0gKi8KICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CiAgICBsYW5jZS0+UkFQID0gQ1NSMTA7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls0NzozMl0gKi8KICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CiAgICBsYW5jZS0+UkFQID0gQ1NSMTE7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls2Mzo0OF0gKi8KICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CgogICAgLyogU2V0IHRoZSBFdGhlcm5ldCBIYXJkd2FyZSBBZGRyZXNzICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMTI7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzE1OjBdICovCiAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzBdOwogICAgbGFuY2UtPlJBUCA9IENTUjEzOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlszMToxNl0gKi8KICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMV07CiAgICBsYW5jZS0+UkFQID0gQ1NSMTQ7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzQ3OjMyXSAqLwogICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVsyXTsKCiAgICAvKiBTZXQgdGhlIEluaXQgQmxvY2sgTW9kZSAqLwogICAgbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwogICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKCiAgICAvKiBTZXQgdGhlIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBQb2ludGVyICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMzA7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgVHJhbnNtaXQgUmluZyAqLwogICAgbGFuY2UtPlJEUCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9yaW5nKSk7CiAgICBsYW5jZS0+UkFQID0gQ1NSMzE7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgdHJhbnNtaXQgUmluZyAqLwogICAgbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfcmluZykpOwoKICAgIC8qIFNldCB0aGUgUmVjZWl2ZSBEZXNjcmlwdG9yIFJpbmcgUG9pbnRlciAqLwogICAgbGFuY2UtPlJBUCA9IENTUjI0OwkJLyogQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLwogICAgbGFuY2UtPlJEUCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9yaW5nKSk7CiAgICBsYW5jZS0+UkFQID0gQ1NSMjU7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCiAgICBsYW5jZS0+UkRQID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9yaW5nKSk7CgogICAgLyogU2V0IHRoZSBOdW1iZXIgb2YgUlggYW5kIFRYIFJpbmcgRW50cmllcyAqLwogICAgbGFuY2UtPlJBUCA9IENTUjc2OwkJLyogUmVjZWl2ZSBSaW5nIExlbmd0aCAqLwogICAgbGFuY2UtPlJEUCA9IHN3YXB3KCgodV9zaG9ydCktUlhfUklOR19TSVpFKSk7CiAgICBsYW5jZS0+UkFQID0gQ1NSNzg7CQkvKiBUcmFuc21pdCBSaW5nIExlbmd0aCAqLwogICAgbGFuY2UtPlJEUCA9IHN3YXB3KCgodV9zaG9ydCktVFhfUklOR19TSVpFKSk7CgogICAgLyogRW5hYmxlIE1lZGlhIEludGVyZmFjZSBQb3J0IEF1dG8gU2VsZWN0ICgxMEJBU0UtMi8xMEJBU0UtVCkgKi8KICAgIGxhbmNlLT5SQVAgPSBJU0FDU1IyOwkvKiBNaXNjZWxsYW5lb3VzIENvbmZpZ3VyYXRpb24gKi8KICAgIGxhbmNlLT5JRFAgPSBBU0VMOwoKICAgIC8qIExFRCBDb250cm9sICovCiAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNTsJLyogTEVEMSBTdGF0dXMgKi8KICAgIGxhbmNlLT5JRFAgPSBQU0V8WE1URTsKICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I2OwkvKiBMRUQyIFN0YXR1cyAqLwogICAgbGFuY2UtPklEUCA9IFBTRXxDT0xFOwogICAgbGFuY2UtPlJBUCA9IElTQUNTUjc7CS8qIExFRDMgU3RhdHVzICovCiAgICBsYW5jZS0+SURQID0gUFNFfFJDVkU7CgogICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKCiAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhcmlhZG5lX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYpOwogICAgaWYgKGkpIHJldHVybiBpOwoKICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCiAgICBsYW5jZS0+UkRQID0gSU5FQXxTVFJUOwoKICAgIHJldHVybiAwOwp9CgoKc3RhdGljIHZvaWQgYXJpYWRuZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VkYXRhICpsYW5jZWRhdGEgPSAoc3RydWN0IGxhbmNlZGF0YSAqKWRldi0+bWVtX3N0YXJ0OwogICAgaW50IGk7CgogICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoKICAgIHByaXYtPnR4X2Z1bGwgPSAwOwogICAgcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3R4ID0gMDsKICAgIHByaXYtPmRpcnR5X3R4ID0gMDsKCiAgICAvKiBTZXQgdXAgVFggUmluZyAqLwogICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7Cgl2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdCA9ICZsYW5jZWRhdGEtPnR4X3JpbmdbaV07Cgl0LT5UTUQwID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X2J1ZmZbaV0pKTsKCXQtPlRNRDEgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X2J1ZmZbaV0pKSB8CgkJICBURl9TVFAgfCBURl9FTlA7Cgl0LT5UTUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7Cgl0LT5UTUQzID0gMDsKCXByaXYtPnR4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOwoJcHJpdi0+dHhfYnVmZltpXSA9IGxhbmNlZGF0YS0+dHhfYnVmZltpXTsKI2lmIDAKCXByaW50ayhLRVJOX0RFQlVHICJUWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKCSAgICAgICAmbGFuY2VkYXRhLT50eF9yaW5nW2ldLCBsYW5jZWRhdGEtPnR4X2J1ZmZbaV0pOwojZW5kaWYKICAgIH0KCiAgICAvKiBTZXQgdXAgUlggUmluZyAqLwogICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7Cgl2b2xhdGlsZSBzdHJ1Y3QgUkRSRSAqciA9ICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV07CglyLT5STUQwID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X2J1ZmZbaV0pKTsKCXItPlJNRDEgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X2J1ZmZbaV0pKSB8CgkJICBSRl9PV047CglyLT5STUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7CglyLT5STUQzID0gMHgwMDAwOwoJcHJpdi0+cnhfcmluZ1tpXSA9ICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV07Cglwcml2LT5yeF9idWZmW2ldID0gbGFuY2VkYXRhLT5yeF9idWZmW2ldOwojaWYgMAoJcHJpbnRrKEtFUk5fREVCVUcgIlJYIEVudHJ5ICUyZCBhdCAlcCwgQnVmIGF0ICVwXG4iLCBpLAoJICAgICAgICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV0sIGxhbmNlZGF0YS0+cnhfYnVmZltpXSk7CiNlbmRpZgogICAgfQp9CgoKc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwoKICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCiAgICBsYW5jZS0+UkFQID0gQ1NSMTEyOwkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCgogICAgaWYgKGFyaWFkbmVfZGVidWcgPiAxKSB7CglwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKCSAgICAgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOwoJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlbHUgcGFja2V0cyBtaXNzZWRcbiIsIGRldi0+bmFtZSwKCSAgICAgICBwcml2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKICAgIH0KCiAgICAvKiBXZSBzdG9wIHRoZSBMQU5DRSBoZXJlIC0tIGl0IG9jY2FzaW9uYWxseSBwb2xscyBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCiAgICBsYW5jZS0+UkRQID0gU1RPUDsKCiAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CgogICAgcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW5saW5lIHZvaWQgYXJpYWRuZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CgogICAgbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CiAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOwogICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cn0KCgpzdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CiAgICBpbnQgY3NyMCwgYm9ndXNjbnQ7CiAgICBpbnQgaGFuZGxlZCA9IDA7CgogICAgaWYgKGRldiA9PSBOVUxMKSB7CglwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX2ludGVycnVwdCgpOiBpcnEgZm9yIHVua25vd24gZGV2aWNlLlxuIik7CglyZXR1cm4gSVJRX05PTkU7CiAgICB9CgogICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCgogICAgaWYgKCEobGFuY2UtPlJEUCAmIElOVFIpKQkJLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgYmVlbiAqLwoJcmV0dXJuIElSUV9OT05FOwkJLyogZ2VuZXJhdGVkIGJ5IHRoZSBib2FyZC4gKi8KCiAgICBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKCiAgICBib2d1c2NudCA9IDEwOwogICAgd2hpbGUgKChjc3IwID0gbGFuY2UtPlJEUCkgJiAoRVJSfFJJTlR8VElOVCkgJiYgLS1ib2d1c2NudCA+PSAwKSB7CgkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KCWxhbmNlLT5SRFAgPSBjc3IwICYgfihJTkVBfFRETUR8U1RPUHxTVFJUfElOSVQpOwoKI2lmIDAKCWlmIChhcmlhZG5lX2RlYnVnID4gNSkgewoJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0ICBjc3IwPSUjMi4yeCBuZXcgY3NyPSUjMi4yeC4iLAoJCSAgIGRldi0+bmFtZSwgY3NyMCwgbGFuY2UtPlJEUCk7CgkgICAgcHJpbnRrKCJbIik7CgkgICAgaWYgKGNzcjAgJiBJTlRSKQoJCXByaW50aygiIElOVFIiKTsKCSAgICBpZiAoY3NyMCAmIElORUEpCgkJcHJpbnRrKCIgSU5FQSIpOwoJICAgIGlmIChjc3IwICYgUlhPTikKCQlwcmludGsoIiBSWE9OIik7CgkgICAgaWYgKGNzcjAgJiBUWE9OKQoJCXByaW50aygiIFRYT04iKTsKCSAgICBpZiAoY3NyMCAmIFRETUQpCgkJcHJpbnRrKCIgVERNRCIpOwoJICAgIGlmIChjc3IwICYgU1RPUCkKCQlwcmludGsoIiBTVE9QIik7CgkgICAgaWYgKGNzcjAgJiBTVFJUKQoJCXByaW50aygiIFNUUlQiKTsKCSAgICBpZiAoY3NyMCAmIElOSVQpCgkJcHJpbnRrKCIgSU5JVCIpOwoJICAgIGlmIChjc3IwICYgRVJSKQoJCXByaW50aygiIEVSUiIpOwoJICAgIGlmIChjc3IwICYgQkFCTCkKCQlwcmludGsoIiBCQUJMIik7CgkgICAgaWYgKGNzcjAgJiBDRVJSKQoJCXByaW50aygiIENFUlIiKTsKCSAgICBpZiAoY3NyMCAmIE1JU1MpCgkJcHJpbnRrKCIgTUlTUyIpOwoJICAgIGlmIChjc3IwICYgTUVSUikKCQlwcmludGsoIiBNRVJSIik7CgkgICAgaWYgKGNzcjAgJiBSSU5UKQoJCXByaW50aygiIFJJTlQiKTsKCSAgICBpZiAoY3NyMCAmIFRJTlQpCgkJcHJpbnRrKCIgVElOVCIpOwoJICAgIGlmIChjc3IwICYgSURPTikKCQlwcmludGsoIiBJRE9OIik7CgkgICAgcHJpbnRrKCIgXVxuIik7Cgl9CiNlbmRpZgoKCWlmIChjc3IwICYgUklOVCkgewkvKiBSeCBpbnRlcnJ1cHQgKi8KCSAgICBoYW5kbGVkID0gMTsKCSAgICBhcmlhZG5lX3J4KGRldik7Cgl9CgoJaWYgKGNzcjAgJiBUSU5UKSB7CS8qIFR4LWRvbmUgaW50ZXJydXB0ICovCgkgICAgaW50IGRpcnR5X3R4ID0gcHJpdi0+ZGlydHlfdHg7CgoJICAgIGhhbmRsZWQgPSAxOwoJICAgIHdoaWxlIChkaXJ0eV90eCA8IHByaXYtPmN1cl90eCkgewoJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOwoJCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxKTsKCgkJaWYgKHN0YXR1cyAmIFRGX09XTikKCQkgICAgYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KCgkJcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEgJj0gMHhmZjAwOwoKCQlpZiAoc3RhdHVzICYgVEZfRVJSKSB7CgkJICAgIC8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLwoJCSAgICBpbnQgZXJyX3N0YXR1cyA9IHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzOwoJCSAgICBwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9SVFJZKQoJCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwoJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX0xDQVIpCgkJCXByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CgkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENPTCkKCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOwoJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX1VGTE8pIHsKCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCgkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CgkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggRklGTyBlcnJvciEgU3RhdHVzICU0LjR4LlxuIiwKCQkJICAgICAgIGRldi0+bmFtZSwgY3NyMCk7CgkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCgkJCWxhbmNlLT5SRFAgPSBTVFJUOwoJCSAgICB9CgkJfSBlbHNlIHsKCQkgICAgaWYgKHN0YXR1cyAmIChURl9NT1JFfFRGX09ORSkpCgkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKCQkgICAgcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwoJCX0KCQlkaXJ0eV90eCsrOwoJICAgIH0KCiNpZm5kZWYgZmluYWxfdmVyc2lvbgoJICAgIGlmIChwcml2LT5jdXJfdHggLSBkaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpIHsKCQlwcmludGsoS0VSTl9FUlIgIm91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgIgoJCSAgICAgICAiZnVsbD0lZC5cbiIsIGRpcnR5X3R4LCBwcml2LT5jdXJfdHgsIHByaXYtPnR4X2Z1bGwpOwoJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKCSAgICB9CiNlbmRpZgoKCSAgICBpZiAocHJpdi0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKCQlkaXJ0eV90eCA+IHByaXYtPmN1cl90eCAtIFRYX1JJTkdfU0laRSArIDIpIHsKCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbC4gKi8KCQlwcml2LT50eF9mdWxsID0gMDsKCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CgkgICAgfQoKCSAgICBwcml2LT5kaXJ0eV90eCA9IGRpcnR5X3R4OwoJfQoKCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KCWlmIChjc3IwICYgQkFCTCkgewoJICAgIGhhbmRsZWQgPSAxOwoJICAgIHByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwkvKiBUeCBiYWJibGUuICovCgl9CglpZiAoY3NyMCAmIE1JU1MpIHsKCSAgICBoYW5kbGVkID0gMTsKCSAgICBwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCgl9CglpZiAoY3NyMCAmIE1FUlIpIHsKCSAgICBoYW5kbGVkID0gMTsKCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAiCgkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBjc3IwKTsKCSAgICAvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLwoJICAgIGxhbmNlLT5SRFAgPSBTVFJUOwoJfQogICAgfQoKICAgIC8qIENsZWFyIGFueSBvdGhlciBpbnRlcnJ1cHQsIGFuZCBzZXQgaW50ZXJydXB0IGVuYWJsZS4gKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCiAgICBsYW5jZS0+UkRQID0gSU5FQXxCQUJMfENFUlJ8TUlTU3xNRVJSfElET047CgojaWYgMAogICAgaWYgKGFyaWFkbmVfZGVidWcgPiA0KQoJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgY3NyJWQ9JSM0LjR4LlxuIiwgZGV2LT5uYW1lLAoJICAgICAgIGxhbmNlLT5SQVAsIGxhbmNlLT5SRFApOwojZW5kaWYKICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwp9CgoKc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKCiAgICBwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKCSAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7CiAgICBhcmlhZG5lX3Jlc2V0KGRldik7CiAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cn0KCgpzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKICAgIGludCBlbnRyeTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICBpbnQgbGVuID0gc2tiLT5sZW47CgojaWYgMAogICAgaWYgKGFyaWFkbmVfZGVidWcgPiAzKSB7CglsYW5jZS0+UkFQID0gQ1NSMDsJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCglwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFyaWFkbmVfc3RhcnRfeG1pdCgpIGNhbGxlZCwgY3NyMCAlNC40eC5cbiIsCgkgICAgICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKCWxhbmNlLT5SRFAgPSAweDAwMDA7CiAgICB9CiNlbmRpZgoKICAgIC8qIEZJWE1FOiBpcyB0aGUgNzlDOTYwIG5ldyBlbm91Z2ggdG8gZG8gaXRzIG93biBwYWRkaW5nIHJpZ2h0ID8gKi8KICAgIGlmIChza2ItPmxlbiA8IEVUSF9aTEVOKQogICAgewogICAgCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAgICAJICAgIHJldHVybiAwOwogICAgCWxlbiA9IEVUSF9aTEVOOwogICAgfQoKICAgIC8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCgojaWYgMAogICAgcHJpbnRrKEtFUk5fREVCVUcgIlRYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOwogICAgewoJaW50IGk7Cgl1X2NoYXIgKnB0ciA9ICYoKHVfY2hhciAqKXNrYi0+ZGF0YSlbNl07Cglmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CiAgICB9CiAgICBwcmludGsoIiB0byAiKTsKICAgIHsKCWludCBpOwoJdV9jaGFyICpwdHIgPSAodV9jaGFyICopc2tiLT5kYXRhOwoJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOwogICAgfQogICAgcHJpbnRrKCIgZGF0YSAweCUwOHggbGVuICVkXG4iLCAoaW50KXNrYi0+ZGF0YSwgKGludClza2ItPmxlbik7CiNlbmRpZgoKICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCiAgICBlbnRyeSA9IHByaXYtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKCiAgICAvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgYmFzZSBhZGRyZXNzIHdpdGgKCQl0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLwoKICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQyID0gc3dhcHcoKHVfc2hvcnQpLXNrYi0+bGVuKTsKICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzID0gMHgwMDAwOwogICAgbWVtY3B5dyhwcml2LT50eF9idWZmW2VudHJ5XSwgKHVfc2hvcnQgKilza2ItPmRhdGEsIGxlbik7CgojaWYgMAogICAgewoJaW50IGksIGxlbjsKCglsZW4gPSBza2ItPmxlbiA+IDY0ID8gNjQgOiBza2ItPmxlbjsKCWxlbiA+Pj0gMTsKCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkgewoJICAgIGludCBqOwoJICAgIHByaW50ayhLRVJOX0RFQlVHICIlMDR4OiIsIGkpOwoJICAgIGZvciAoaiA9IDA7IChqIDwgOCkgJiYgKChpK2opIDwgbGVuKTsgaisrKSB7CgkJaWYgKCEoaiAmIDEpKQoJCSAgICBwcmludGsoIiAiKTsKCQlwcmludGsoIiUwNHgiLCBwcml2LT50eF9idWZmW2VudHJ5XVtpK2pdKTsKCSAgICB9CgkgICAgcHJpbnRrKCJcbiIpOwoJfQogICAgfQojZW5kaWYKCiAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSA9IChwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSYweGZmMDApfFRGX09XTnxURl9TVFB8VEZfRU5QOwoKICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKCiAgICBwcml2LT5jdXJfdHgrKzsKICAgIGlmICgocHJpdi0+Y3VyX3R4ID49IFRYX1JJTkdfU0laRSkgJiYgKHByaXYtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkpIHsKCiNpZiAwCglwcmludGsoS0VSTl9ERUJVRyAiKioqIFN1YnRyYWN0aW5nIFRYX1JJTkdfU0laRSBmcm9tIGN1cl90eCAoJWQpIGFuZCAiCgkgICAgICAgImRpcnR5X3R4ICglZClcbiIsIHByaXYtPmN1cl90eCwgcHJpdi0+ZGlydHlfdHgpOwojZW5kaWYKCglwcml2LT5jdXJfdHggLT0gVFhfUklOR19TSVpFOwoJcHJpdi0+ZGlydHlfdHggLT0gVFhfUklOR19TSVpFOwogICAgfQoKICAgIC8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbC4gKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCiAgICBsYW5jZS0+UkRQID0gSU5FQXxURE1EOwoKICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwoKICAgIGlmIChsb3diKHByaXYtPnR4X3JpbmdbKGVudHJ5KzEpICUgVFhfUklOR19TSVpFXS0+VE1EMSkgIT0gMCkgewoJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwoJcHJpdi0+dHhfZnVsbCA9IDE7CiAgICB9CiAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgogICAgcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICBpbnQgZW50cnkgPSBwcml2LT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CiAgICBpbnQgaTsKCiAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLwogICAgd2hpbGUgKCEobG93Yihwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSkgJiBSRl9PV04pKSB7CglpbnQgc3RhdHVzID0gbG93Yihwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSk7CgoJaWYgKHN0YXR1cyAhPSAoUkZfU1RQfFJGX0VOUCkpIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLwoJICAgIC8qIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAoJCTxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCBmdWxsLXNpemVkCgkJYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3bwoJCWJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4gKi8KCSAgICBpZiAoc3RhdHVzICYgUkZfRU5QKQoJCS8qIE9ubHkgY291bnQgYSBnZW5lcmFsIGVycm9yIGF0IHRoZSBlbmQgb2YgYSBwYWNrZXQuKi8KCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKCSAgICBpZiAoc3RhdHVzICYgUkZfRlJBTSkKCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKCSAgICBpZiAoc3RhdHVzICYgUkZfT0ZMTykKCQlwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwoJICAgIGlmIChzdGF0dXMgJiBSRl9DUkMpCgkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwoJICAgIGlmIChzdGF0dXMgJiBSRl9CVUZGKQoJCXByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CgkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgJj0gMHhmZjAwfFJGX1NUUHxSRl9FTlA7Cgl9IGVsc2UgewoJICAgIC8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTMuICovCgkgICAgc2hvcnQgcGt0X2xlbiA9IHN3YXB3KHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQzKTsKCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CgkgICAgaWYgKHNrYiA9PSBOVUxMKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKCQkgICAgICAgZGV2LT5uYW1lKTsKCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCgkJICAgIGlmIChsb3diKHByaXYtPnJ4X3JpbmdbKGVudHJ5K2kpICUgUlhfUklOR19TSVpFXS0+Uk1EMSkgJiBSRl9PV04pCgkJCWJyZWFrOwoKCQlpZiAoaSA+IFJYX1JJTkdfU0laRS0yKSB7CgkJICAgIHByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCQkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOwoJCSAgICBwcml2LT5jdXJfcngrKzsKCQl9CgkJYnJlYWs7CgkgICAgfQoKCgkgICAgc2tiLT5kZXYgPSBkZXY7CgkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLwoJICAgIHNrYl9wdXQoc2tiLHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KCSAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgKGNoYXIgKilwcml2LT5yeF9idWZmW2VudHJ5XSwgcGt0X2xlbiwwKTsKCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwojaWYgMAoJICAgIHByaW50ayhLRVJOX0RFQlVHICJSWCBwa3QgdHlwZSAweCUwNHggZnJvbSAiLAoJCSAgICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOwoJICAgIHsKCQlpbnQgaTsKCQl1X2NoYXIgKnB0ciA9ICYoKHVfY2hhciAqKXNrYi0+ZGF0YSlbNl07CgkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKCQkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKCSAgICB9CgkgICAgcHJpbnRrKCIgdG8gIik7CgkgICAgewoJCWludCBpOwoJCXVfY2hhciAqcHRyID0gKHVfY2hhciAqKXNrYi0+ZGF0YTsKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQoJCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOwoJICAgIH0KCSAgICBwcmludGsoIiBkYXRhIDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKI2VuZGlmCgoJICAgIG5ldGlmX3J4KHNrYik7CgkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCSAgICBwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CgkgICAgcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKCX0KCglwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047CgllbnRyeSA9ICgrK3ByaXYtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CiAgICB9CgogICAgcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOwoKICAgIC8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCSBJZiBub3QsCiAgICAgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CiAgICBzaG9ydCBzYXZlZF9hZGRyOwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKCiAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAgICBzYXZlZF9hZGRyID0gbGFuY2UtPlJBUDsKICAgIGxhbmNlLT5SQVAgPSBDU1IxMTI7CQkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKICAgIGxhbmNlLT5SQVAgPSBzYXZlZF9hZGRyOwogICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwoKICAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cn0KCgovKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KICAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCiAgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKICAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgogKi8Kc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKCiAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKCXJldHVybjsKCiAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CgogICAgLyogV2UgdGFrZSB0aGUgc2ltcGxlIHdheSBvdXQgYW5kIGFsd2F5cyBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZS4gKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CQkJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuICovCiAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOwoKICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKCWxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KCWxhbmNlLT5SRFAgPSBQUk9NOwkJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KICAgIH0gZWxzZSB7CglzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CglpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKCWludCBpOwoJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyIGZpbHRlcmluZy4gKi8KCW1lbXNldChtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsCgkgICAgICAgc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkpOwoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJICAgIGxhbmNlLT5SQVAgPSBDU1I4KyhpPDw4KTsJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAqLwoJICAgIGxhbmNlLT5SRFAgPSBzd2FwdyhtdWx0aWNhc3RfdGFibGVbaV0pOwoJfQoJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwoJbGFuY2UtPlJEUCA9IDB4MDAwMDsJCS8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KICAgIH0KCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlR8SURPTjsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCgogICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwp9CgoKc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gem9ycm9fZ2V0X2RydmRhdGEoeik7CgogICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCkpOwogICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5tZW1fc3RhcnQpLCBBUklBRE5FX1JBTV9TSVpFKTsKICAgIGZyZWVfbmV0ZGV2KGRldik7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGFyaWFkbmVfaW5pdF9tb2R1bGUodm9pZCkKewogICAgcmV0dXJuIHpvcnJvX3JlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgYXJpYWRuZV9jbGVhbnVwX21vZHVsZSh2b2lkKQp7CiAgICB6b3Jyb191bnJlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChhcmlhZG5lX2luaXRfbW9kdWxlKTsKbW9kdWxlX2V4aXQoYXJpYWRuZV9jbGVhbnVwX21vZHVsZSk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==