LyoKICogIEFtaWdhIExpbnV4L202OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKICoKICogIKkgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gKGdlZXJ0QGxpbnV4LW02OGsub3JnKQogKgkJCSAgICAgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKQogKgogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24KICoKICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCiAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCiAqCiAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCiAqCQkJUHVibGljYXRpb24gIzE2OTA3LCBSZXYuIEIsIEFtZW5kbWVudC8wLCBNYXkgMTk5NAogKgogKglNQzY4MjMwOglQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgKFBJL1QpCiAqCQkJTW90b3JvbGEgU2VtaWNvbmR1Y3RvcnMsIERlY2VtYmVyLCAxOTgzCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eAogKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIFRoZSBBcmlhZG5lIGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBWaWxsYWdlIFRyb25pYy4gSXQgY29udGFpbnM6CiAqCiAqCS0gYW4gQW03OUM5NjAgUENuZXQtSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBib3RoCiAqCSAgMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIDEwQkFTRS1UIChVVFApIGNvbm5lY3RvcnMKICoKICoJLSBhbiBNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lciBjb25maWd1cmVkIGFzIDIgcGFyYWxsZWwgcG9ydHMKICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvem9ycm8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgoKI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CgojaW5jbHVkZSAiYXJpYWRuZS5oIgoKCiNpZmRlZiBBUklBRE5FX0RFQlVHCmludCBhcmlhZG5lX2RlYnVnID0gQVJJQURORV9ERUJVRzsKI2Vsc2UKaW50IGFyaWFkbmVfZGVidWcgPSAxOwojZW5kaWYKCgogICAgLyoKICAgICAqCU1hY3JvcyB0byBGaXggRW5kaWFubmVzcyBwcm9ibGVtcwogICAgICovCgoJCQkJLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCiNkZWZpbmUgc3dhcHcoeCkJKCgoeD4+OCkmMHgwMGZmKXwoKHg8PDgpJjB4ZmYwMCkpCgkJCQkvKiBHZXQgdGhlIExvdyBCWVRFIGluIGEgV09SRCAqLwojZGVmaW5lIGxvd2IoeCkJCSh4JjB4ZmYpCgkJCQkvKiBHZXQgdGhlIFN3YXBwZWQgSGlnaCBXT1JEIGluIGEgTE9ORyAqLwojZGVmaW5lIHN3aGlnaHcoeCkJKCgoKHgpPj44KSYweGZmMDApfCgoKHgpPj4yNCkmMHgwMGZmKSkKCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBMb3cgV09SRCBpbiBhIExPTkcgKi8KI2RlZmluZSBzd2xvd3coeCkJKCgoKHgpPDw4KSYweGZmMDApfCgoKHgpPj44KSYweDAwZmYpKQoKCiAgICAvKgogICAgICoJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCiAgICAgKi8KCiNkZWZpbmUgVFhfUklOR19TSVpFCTUKI2RlZmluZSBSWF9SSU5HX1NJWkUJMTYKCiNkZWZpbmUgUEtUX0JVRl9TSVpFCTE1MjAKCgogICAgLyoKICAgICAqCVByaXZhdGUgRGV2aWNlIERhdGEKICAgICAqLwoKc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSB7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdHhfcmluZ1tUWF9SSU5HX1NJWkVdOwogICAgdm9sYXRpbGUgc3RydWN0IFJEUkUgKnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnR4X2J1ZmZbVFhfUklOR19TSVpFXTsKICAgIHZvbGF0aWxlIHVfc2hvcnQgKnJ4X2J1ZmZbUlhfUklOR19TSVpFXTsKICAgIGludCBjdXJfdHgsIGN1cl9yeDsJCQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KICAgIGludCBkaXJ0eV90eDsJCQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLwogICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgICBjaGFyIHR4X2Z1bGw7Cn07CgoKICAgIC8qCiAgICAgKglTdHJ1Y3R1cmUgQ3JlYXRlZCBpbiB0aGUgQXJpYWRuZSdzIFJBTSBCdWZmZXIKICAgICAqLwoKc3RydWN0IGxhbmNlZGF0YSB7CiAgICBzdHJ1Y3QgVERSRSB0eF9yaW5nW1RYX1JJTkdfU0laRV07CiAgICBzdHJ1Y3QgUkRSRSByeF9yaW5nW1JYX1JJTkdfU0laRV07CiAgICB1X3Nob3J0IHR4X2J1ZmZbVFhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUvc2l6ZW9mKHVfc2hvcnQpXTsKICAgIHVfc2hvcnQgcnhfYnVmZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOwp9OwoKc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CnN0YXRpYyBpcnFyZXR1cm5fdCBhcmlhZG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKTsKc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwojaWZkZWYgSEFWRV9NVUxUSUNBU1QKc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwojZW5kaWYKCgpzdGF0aWMgdm9pZCBtZW1jcHl3KHZvbGF0aWxlIHVfc2hvcnQgKmRlc3QsIHVfc2hvcnQgKnNyYywgaW50IGxlbikKewogICAgd2hpbGUgKGxlbiA+PSAyKSB7CgkqKGRlc3QrKykgPSAqKHNyYysrKTsKCWxlbiAtPSAyOwogICAgfQogICAgaWYgKGxlbiA9PSAxKQoJKmRlc3QgPSAoKih1X2NoYXIgKilzcmMpPDw4Owp9CgoKc3RhdGljIGludCBfX2RldmluaXQgYXJpYWRuZV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAoJCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKCgpzdGF0aWMgc3RydWN0IHpvcnJvX2RldmljZV9pZCBhcmlhZG5lX3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAgICB7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORSB9LAogICAgeyAwIH0KfTsKCnN0YXRpYyBzdHJ1Y3Qgem9ycm9fZHJpdmVyIGFyaWFkbmVfZHJpdmVyID0gewogICAgLm5hbWUJPSAiYXJpYWRuZSIsCiAgICAuaWRfdGFibGUJPSBhcmlhZG5lX3pvcnJvX3RibCwKICAgIC5wcm9iZQk9IGFyaWFkbmVfaW5pdF9vbmUsCiAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoYXJpYWRuZV9yZW1vdmVfb25lKSwKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGFyaWFkbmVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKewogICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwogICAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBib2FyZCtBUklBRE5FX0xBTkNFOwogICAgdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBib2FyZCtBUklBRE5FX1JBTTsKICAgIHN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OwogICAgaW50IGVycjsKICAgIERFQ0xBUkVfTUFDX0JVRihtYWMpOwoKICAgIHIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCksICJBbTc5Qzk2MCIpOwogICAgaWYgKCFyMSkKCXJldHVybiAtRUJVU1k7CiAgICByMiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUsICJSQU0iKTsKICAgIGlmICghcjIpIHsKCXJlbGVhc2VfcmVzb3VyY2UocjEpOwoJcmV0dXJuIC1FQlVTWTsKICAgIH0KCiAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSkpOwogICAgaWYgKGRldiA9PSBOVUxMKSB7CglyZWxlYXNlX3Jlc291cmNlKHIxKTsKCXJlbGVhc2VfcmVzb3VyY2UocjIpOwoJcmV0dXJuIC1FTk9NRU07CiAgICB9CgogICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgogICAgcjEtPm5hbWUgPSBkZXYtPm5hbWU7CiAgICByMi0+bmFtZSA9IGRldi0+bmFtZTsKCiAgICBkZXYtPmRldl9hZGRyWzBdID0gMHgwMDsKICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDYwOwogICAgZGV2LT5kZXZfYWRkclsyXSA9IDB4MzA7CiAgICBkZXYtPmRldl9hZGRyWzNdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjE2KSAmIDB4ZmY7CiAgICBkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKICAgIGRldi0+ZGV2X2FkZHJbNV0gPSB6LT5yb20uZXJfU2VyaWFsTnVtYmVyICYgMHhmZjsKICAgIGRldi0+YmFzZV9hZGRyID0gWlRXT19WQUREUihiYXNlX2FkZHIpOwogICAgZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CiAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCtBUklBRE5FX1JBTV9TSVpFOwoKICAgIGRldi0+b3BlbiA9ICZhcmlhZG5lX29wZW47CiAgICBkZXYtPnN0b3AgPSAmYXJpYWRuZV9jbG9zZTsKICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFyaWFkbmVfc3RhcnRfeG1pdDsKICAgIGRldi0+dHhfdGltZW91dCA9ICZhcmlhZG5lX3R4X3RpbWVvdXQ7CiAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKICAgIGRldi0+Z2V0X3N0YXRzID0gJmFyaWFkbmVfZ2V0X3N0YXRzOwogICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OwoKICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogICAgaWYgKGVycikgewoJcmVsZWFzZV9yZXNvdXJjZShyMSk7CglyZWxlYXNlX3Jlc291cmNlKHIyKTsKCWZyZWVfbmV0ZGV2KGRldik7CglyZXR1cm4gZXJyOwogICAgfQogICAgem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKCiAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXJpYWRuZSBhdCAweCUwOGx4LCBFdGhlcm5ldCBBZGRyZXNzICIKCSAgICIlc1xuIiwgZGV2LT5uYW1lLCBib2FyZCwKCSAgIHByaW50X21hYyhtYWMsIGRldi0+ZGV2X2FkZHIpKTsKCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgYXJpYWRuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKICAgIHVfc2hvcnQgaW47CiAgICB1X2xvbmcgdmVyc2lvbjsKICAgIGludCBpOwoKICAgIC8qIFJlc2V0IHRoZSBMQU5DRSAqLwogICAgaW4gPSBsYW5jZS0+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+UkRQID0gU1RPUDsKCiAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CgogICAgcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW5saW5lIHZvaWQgYXJpYWRuZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CgogICAgbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CiAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOwogICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cn0KCgpzdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKewogICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CiAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OwogICAgaW50IGNzcjAsIGJvZ3VzY250OwogICAgaW50IGhhbmRsZWQgPSAwOwoKICAgIGlmIChkZXYgPT0gTlVMTCkgewoJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9pbnRlcnJ1cHQoKTogaXJxIGZvciB1bmtub3duIGRldmljZS5cbiIpOwoJcmV0dXJuIElSUV9OT05FOwogICAgfQoKICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwoKICAgIGlmICghKGxhbmNlLT5SRFAgJiBJTlRSKSkJCS8qIENoZWNrIGlmIGFueSBpbnRlcnJ1cHQgaGFzIGJlZW4gKi8KCXJldHVybiBJUlFfTk9ORTsJCS8qIGdlbmVyYXRlZCBieSB0aGUgYm9hcmQuICovCgogICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CgogICAgYm9ndXNjbnQgPSAxMDsKICAgIHdoaWxlICgoY3NyMCA9IGxhbmNlLT5SRFApICYgKEVSUnxSSU5UfFRJTlQpICYmIC0tYm9ndXNjbnQgPj0gMCkgewoJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCglsYW5jZS0+UkRQID0gY3NyMCAmIH4oSU5FQXxURE1EfFNUT1B8U1RSVHxJTklUKTsKCiNpZiAwCglpZiAoYXJpYWRuZV9kZWJ1ZyA+IDUpIHsKCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAgY3NyMD0lIzIuMnggbmV3IGNzcj0lIzIuMnguIiwKCQkgICBkZXYtPm5hbWUsIGNzcjAsIGxhbmNlLT5SRFApOwoJICAgIHByaW50aygiWyIpOwoJICAgIGlmIChjc3IwICYgSU5UUikKCQlwcmludGsoIiBJTlRSIik7CgkgICAgaWYgKGNzcjAgJiBJTkVBKQoJCXByaW50aygiIElORUEiKTsKCSAgICBpZiAoY3NyMCAmIFJYT04pCgkJcHJpbnRrKCIgUlhPTiIpOwoJICAgIGlmIChjc3IwICYgVFhPTikKCQlwcmludGsoIiBUWE9OIik7CgkgICAgaWYgKGNzcjAgJiBURE1EKQoJCXByaW50aygiIFRETUQiKTsKCSAgICBpZiAoY3NyMCAmIFNUT1ApCgkJcHJpbnRrKCIgU1RPUCIpOwoJICAgIGlmIChjc3IwICYgU1RSVCkKCQlwcmludGsoIiBTVFJUIik7CgkgICAgaWYgKGNzcjAgJiBJTklUKQoJCXByaW50aygiIElOSVQiKTsKCSAgICBpZiAoY3NyMCAmIEVSUikKCQlwcmludGsoIiBFUlIiKTsKCSAgICBpZiAoY3NyMCAmIEJBQkwpCgkJcHJpbnRrKCIgQkFCTCIpOwoJICAgIGlmIChjc3IwICYgQ0VSUikKCQlwcmludGsoIiBDRVJSIik7CgkgICAgaWYgKGNzcjAgJiBNSVNTKQoJCXByaW50aygiIE1JU1MiKTsKCSAgICBpZiAoY3NyMCAmIE1FUlIpCgkJcHJpbnRrKCIgTUVSUiIpOwoJICAgIGlmIChjc3IwICYgUklOVCkKCQlwcmludGsoIiBSSU5UIik7CgkgICAgaWYgKGNzcjAgJiBUSU5UKQoJCXByaW50aygiIFRJTlQiKTsKCSAgICBpZiAoY3NyMCAmIElET04pCgkJcHJpbnRrKCIgSURPTiIpOwoJICAgIHByaW50aygiIF1cbiIpOwoJfQojZW5kaWYKCglpZiAoY3NyMCAmIFJJTlQpIHsJLyogUnggaW50ZXJydXB0ICovCgkgICAgaGFuZGxlZCA9IDE7CgkgICAgYXJpYWRuZV9yeChkZXYpOwoJfQoKCWlmIChjc3IwICYgVElOVCkgewkvKiBUeC1kb25lIGludGVycnVwdCAqLwoJICAgIGludCBkaXJ0eV90eCA9IHByaXYtPmRpcnR5X3R4OwoKCSAgICBoYW5kbGVkID0gMTsKCSAgICB3aGlsZSAoZGlydHlfdHggPCBwcml2LT5jdXJfdHgpIHsKCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKCQlpbnQgc3RhdHVzID0gbG93Yihwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSk7CgoJCWlmIChzdGF0dXMgJiBURl9PV04pCgkJICAgIGJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCgoJCXByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxICY9IDB4ZmYwMDsKCgkJaWYgKHN0YXR1cyAmIFRGX0VSUikgewoJCSAgICAvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KCQkgICAgaW50IGVycl9zdGF0dXMgPSBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMzsKCQkgICAgcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CgkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfUlRSWSkKCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9MQ0FSKQoJCQlwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwoJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX0xDT0wpCgkJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9VRkxPKSB7CgkJCS8qIEFja2shICBPbiBGSUZPIGVycm9ycyB0aGUgVHggdW5pdCBpcyB0dXJuZWQgb2ZmISAqLwoJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwoJCQkvKiBSZW1vdmUgdGhpcyB2ZXJib3NpdHkgbGF0ZXIhICovCgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IEZJRk8gZXJyb3IhIFN0YXR1cyAlNC40eC5cbiIsCgkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjApOwoJCQkvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLwoJCQlsYW5jZS0+UkRQID0gU1RSVDsKCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgIGlmIChzdGF0dXMgJiAoVEZfTU9SRXxURl9PTkUpKQoJCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zKys7CgkJICAgIHByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKCQl9CgkJZGlydHlfdHgrKzsKCSAgICB9CgojaWZuZGVmIGZpbmFsX3ZlcnNpb24KCSAgICBpZiAocHJpdi0+Y3VyX3R4IC0gZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJvdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQsICIKCQkgICAgICAgImZ1bGw9JWQuXG4iLCBkaXJ0eV90eCwgcHJpdi0+Y3VyX3R4LCBwcml2LT50eF9mdWxsKTsKCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CgkgICAgfQojZW5kaWYKCgkgICAgaWYgKHByaXYtPnR4X2Z1bGwgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCgkJZGlydHlfdHggPiBwcml2LT5jdXJfdHggLSBUWF9SSU5HX1NJWkUgKyAyKSB7CgkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwuICovCgkJcHJpdi0+dHhfZnVsbCA9IDA7CgkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwoJICAgIH0KCgkgICAgcHJpdi0+ZGlydHlfdHggPSBkaXJ0eV90eDsKCX0KCgkvKiBMb2cgbWlzYyBlcnJvcnMuICovCglpZiAoY3NyMCAmIEJBQkwpIHsKCSAgICBoYW5kbGVkID0gMTsKCSAgICBwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsJLyogVHggYmFiYmxlLiAqLwoJfQoJaWYgKGNzcjAgJiBNSVNTKSB7CgkgICAgaGFuZGxlZCA9IDE7CgkgICAgcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLwoJfQoJaWYgKGNzcjAgJiBNRVJSKSB7CgkgICAgaGFuZGxlZCA9IDE7CgkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgIgoJCSAgICIlNC40eC5cbiIsIGRldi0+bmFtZSwgY3NyMCk7CgkgICAgLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KCSAgICBsYW5jZS0+UkRQID0gU1RSVDsKCX0KICAgIH0KCiAgICAvKiBDbGVhciBhbnkgb3RoZXIgaW50ZXJydXB0LCBhbmQgc2V0IGludGVycnVwdCBlbmFibGUuICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IElORUF8QkFCTHxDRVJSfE1JU1N8TUVSUnxJRE9OOwoKI2lmIDAKICAgIGlmIChhcmlhZG5lX2RlYnVnID4gNCkKCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzciVkPSUjNC40eC5cbiIsIGRldi0+bmFtZSwKCSAgICAgICBsYW5jZS0+UkFQLCBsYW5jZS0+UkRQKTsKI2VuZGlmCiAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKfQoKCnN0YXRpYyB2b2lkIGFyaWFkbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CgogICAgcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTQuNHgsIHJlc2V0dGluZy5cbiIsCgkgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOwogICAgYXJpYWRuZV9yZXNldChkZXYpOwogICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwp9CgoKc3RhdGljIGludCBhcmlhZG5lX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CiAgICBpbnQgZW50cnk7CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgaW50IGxlbiA9IHNrYi0+bGVuOwoKI2lmIDAKICAgIGlmIChhcmlhZG5lX2RlYnVnID4gMykgewoJbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwoJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhcmlhZG5lX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAoJICAgICAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7CglsYW5jZS0+UkRQID0gMHgwMDAwOwogICAgfQojZW5kaWYKCiAgICAvKiBGSVhNRTogaXMgdGhlIDc5Qzk2MCBuZXcgZW5vdWdoIHRvIGRvIGl0cyBvd24gcGFkZGluZyByaWdodCA/ICovCiAgICBpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikKICAgIHsKICAgIAlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogICAgCSAgICByZXR1cm4gMDsKICAgIAlsZW4gPSBFVEhfWkxFTjsKICAgIH0KCiAgICAvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLwoKI2lmIDAKewogICAgREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAgICBERUNMQVJFX01BQ19CVUYobWFjMik7CgogICAgcHJpbnRrKEtFUk5fREVCVUcgIlRYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICVzIHRvICVzICIKCSAgICIgZGF0YSAweCUwOHggbGVuICVkXG4iLAoJICAgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSwKCSAgIHByaW50X21hYyhtYWMsICgoY29uc3QgdTggKilza2ItPmRhdGEpKzYpLAoJICAgcHJpbnRfbWFjKG1hYywgKGNvbnN0IHU4ICopc2tiLT5kYXRhKSwKCSAgIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKfQojZW5kaWYKCiAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgogICAgZW50cnkgPSBwcml2LT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CgogICAgLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGJhc2UgYWRkcmVzcyB3aXRoCgkJdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KCiAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMiA9IHN3YXB3KCh1X3Nob3J0KS1za2ItPmxlbik7CiAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMyA9IDB4MDAwMDsKICAgIG1lbWNweXcocHJpdi0+dHhfYnVmZltlbnRyeV0sICh1X3Nob3J0ICopc2tiLT5kYXRhLCBsZW4pOwoKI2lmIDAKICAgIHsKCWludCBpLCBsZW47CgoJbGVuID0gc2tiLT5sZW4gPiA2NCA/IDY0IDogc2tiLT5sZW47CglsZW4gPj49IDE7Cglmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHsKCSAgICBpbnQgajsKCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJTA0eDoiLCBpKTsKCSAgICBmb3IgKGogPSAwOyAoaiA8IDgpICYmICgoaStqKSA8IGxlbik7IGorKykgewoJCWlmICghKGogJiAxKSkKCQkgICAgcHJpbnRrKCIgIik7CgkJcHJpbnRrKCIlMDR4IiwgcHJpdi0+dHhfYnVmZltlbnRyeV1baStqXSk7CgkgICAgfQoJICAgIHByaW50aygiXG4iKTsKCX0KICAgIH0KI2VuZGlmCgogICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEgPSAocHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEmMHhmZjAwKXxURl9PV058VEZfU1RQfFRGX0VOUDsKCiAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CgogICAgcHJpdi0+Y3VyX3R4Kys7CiAgICBpZiAoKHByaXYtPmN1cl90eCA+PSBUWF9SSU5HX1NJWkUpICYmIChwcml2LT5kaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpKSB7CgojaWYgMAoJcHJpbnRrKEtFUk5fREVCVUcgIioqKiBTdWJ0cmFjdGluZyBUWF9SSU5HX1NJWkUgZnJvbSBjdXJfdHggKCVkKSBhbmQgIgoJICAgICAgICJkaXJ0eV90eCAoJWQpXG4iLCBwcml2LT5jdXJfdHgsIHByaXYtPmRpcnR5X3R4KTsKI2VuZGlmCgoJcHJpdi0+Y3VyX3R4IC09IFRYX1JJTkdfU0laRTsKCXByaXYtPmRpcnR5X3R4IC09IFRYX1JJTkdfU0laRTsKICAgIH0KICAgIHByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKCiAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IElORUF8VERNRDsKCiAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKCiAgICBpZiAobG93Yihwcml2LT50eF9yaW5nWyhlbnRyeSsxKSAlIFRYX1JJTkdfU0laRV0tPlRNRDEpICE9IDApIHsKCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCXByaXYtPnR4X2Z1bGwgPSAxOwogICAgfQogICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwoKICAgIHJldHVybiAwOwp9CgoKc3RhdGljIGludCBhcmlhZG5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgaW50IGVudHJ5ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOwogICAgaW50IGk7CgogICAgLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KICAgIHdoaWxlICghKGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpICYgUkZfT1dOKSkgewoJaW50IHN0YXR1cyA9IGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpOwoKCWlmIChzdGF0dXMgIT0gKFJGX1NUUHxSRl9FTlApKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KCSAgICAvKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKCQk8bXVyZkBwZXJmdGVjaC5jb20+IHRvIFJ1c3MgTmVsc29uOiBFdmVuIHdpdGggZnVsbC1zaXplZAoJCWJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KCQlidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuICovCgkgICAgaWYgKHN0YXR1cyAmIFJGX0VOUCkKCQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LiovCgkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CgkgICAgaWYgKHN0YXR1cyAmIFJGX0ZSQU0pCgkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CgkgICAgaWYgKHN0YXR1cyAmIFJGX09GTE8pCgkJcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKCSAgICBpZiAoc3RhdHVzICYgUkZfQ1JDKQoJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKCSAgICBpZiAoc3RhdHVzICYgUkZfQlVGRikKCQlwcml2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwoJICAgIHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxICY9IDB4ZmYwMHxSRl9TVFB8UkZfRU5QOwoJfSBlbHNlIHsKCSAgICAvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0zLiAqLwoJICAgIHNob3J0IHBrdF9sZW4gPSBzd2Fwdyhwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMyk7CgkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKCgkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOwoJICAgIGlmIChza2IgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCgkJICAgICAgIGRldi0+bmFtZSk7CgkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQoJCSAgICBpZiAobG93Yihwcml2LT5yeF9yaW5nWyhlbnRyeStpKSAlIFJYX1JJTkdfU0laRV0tPlJNRDEpICYgUkZfT1dOKQoJCQlicmVhazsKCgkJaWYgKGkgPiBSWF9SSU5HX1NJWkUtMikgewoJCSAgICBwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CgkJICAgIHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxIHw9IFJGX09XTjsKCQkgICAgcHJpdi0+Y3VyX3J4Kys7CgkJfQoJCWJyZWFrOwoJICAgIH0KCgoJICAgIHNrYl9yZXNlcnZlKHNrYiwyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCgkgICAgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAoY2hhciAqKXByaXYtPnJ4X2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwojaWYgMAp7CgkgICAgREVDTEFSRV9NQUNfQlVGKG1hYyk7CgoJICAgIHByaW50ayhLRVJOX0RFQlVHICJSWCBwa3QgdHlwZSAweCUwNHggZnJvbSAiLAoJCSAgICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOwoJICAgIHsKCQl1X2NoYXIgKnB0ciA9ICYoKHVfY2hhciAqKXNrYi0+ZGF0YSlbNl07CgkJcHJpbnRrKCIlcyIsIHByaW50X21hYyhtYWMsIHB0cikpOwoJICAgIH0KCSAgICBwcmludGsoIiB0byAiKTsKCSAgICB7CgkJdV9jaGFyICpwdHIgPSAodV9jaGFyICopc2tiLT5kYXRhOwoJCXByaW50aygiJXMiLCBwcmludF9tYWMobWFjLCBwdHIpKTsKCSAgICB9CgkgICAgcHJpbnRrKCIgZGF0YSAweCUwOHggbGVuICVkXG4iLCAoaW50KXNrYi0+ZGF0YSwgKGludClza2ItPmxlbik7Cn0KI2VuZGlmCgoJICAgIG5ldGlmX3J4KHNrYik7CgkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCSAgICBwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CgkgICAgcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKCX0KCglwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047CgllbnRyeSA9ICgrK3ByaXYtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CiAgICB9CgogICAgcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOwoKICAgIC8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCSBJZiBub3QsCiAgICAgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KCiAgICByZXR1cm4gMDsKfQoKCnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CiAgICBzaG9ydCBzYXZlZF9hZGRyOwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKCiAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAgICBzYXZlZF9hZGRyID0gbGFuY2UtPlJBUDsKICAgIGxhbmNlLT5SQVAgPSBDU1IxMTI7CQkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKICAgIGxhbmNlLT5SQVAgPSBzYXZlZF9hZGRyOwogICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwoKICAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cn0KCgovKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KICAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCiAgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKICAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgogKi8Kc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKCiAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKCXJldHVybjsKCiAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CgogICAgLyogV2UgdGFrZSB0aGUgc2ltcGxlIHdheSBvdXQgYW5kIGFsd2F5cyBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZS4gKi8KICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwogICAgbGFuY2UtPlJEUCA9IFNUT1A7CQkJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuICovCiAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOwoKICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKCWxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KCWxhbmNlLT5SRFAgPSBQUk9NOwkJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KICAgIH0gZWxzZSB7CglzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CglpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKCWludCBpOwoJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyIGZpbHRlcmluZy4gKi8KCW1lbXNldChtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsCgkgICAgICAgc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkpOwoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJICAgIGxhbmNlLT5SQVAgPSBDU1I4KyhpPDw4KTsJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAqLwoJICAgIGxhbmNlLT5SRFAgPSBzd2FwdyhtdWx0aWNhc3RfdGFibGVbaV0pOwoJfQoJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwoJbGFuY2UtPlJEUCA9IDB4MDAwMDsJCS8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KICAgIH0KCiAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlR8SURPTjsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCgogICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwp9CgoKc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gem9ycm9fZ2V0X2RydmRhdGEoeik7CgogICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCkpOwogICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5tZW1fc3RhcnQpLCBBUklBRE5FX1JBTV9TSVpFKTsKICAgIGZyZWVfbmV0ZGV2KGRldik7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGFyaWFkbmVfaW5pdF9tb2R1bGUodm9pZCkKewogICAgcmV0dXJuIHpvcnJvX3JlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgYXJpYWRuZV9jbGVhbnVwX21vZHVsZSh2b2lkKQp7CiAgICB6b3Jyb191bnJlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdChhcmlhZG5lX2luaXRfbW9kdWxlKTsKbW9kdWxlX2V4aXQoYXJpYWRuZV9jbGVhbnVwX21vZHVsZSk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==