LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNiBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uLy4uL1NETF9pbnRlcm5hbC5oIgoKI2lmIFNETF9BVURJT19EUklWRVJfU1VOQVVESU8KCi8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBfX05FVEJTRF9fCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+CiNlbmRpZgojaWZkZWYgX19TVlI0CiNpbmNsdWRlIDxzeXMvYXVkaW9pby5oPgojZWxzZQojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIlNETF90aW1lci5oIgojaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCiNpbmNsdWRlICIuLi9TRExfYXVkaW9fYy5oIgojaW5jbHVkZSAiLi4vU0RMX2F1ZGlvZGV2X2MuaCIKI2luY2x1ZGUgIlNETF9zdW5hdWRpby5oIgoKLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjaywgYW5kIGRvbid0IGJsb2NrIGlmIGJ1c3kgKi8KCiNpZiBkZWZpbmVkKEFVRElPX0dFVElORk8pICYmICFkZWZpbmVkKEFVRElPX0dFVEJVRklORk8pCiNkZWZpbmUgQVVESU9fR0VUQlVGSU5GTyBBVURJT19HRVRJTkZPCiNlbmRpZgoKLyogQXVkaW8gZHJpdmVyIGZ1bmN0aW9ucyAqLwpzdGF0aWMgVWludDggc25kMmF1KGludCBzYW1wbGUpOwoKLyogQXVkaW8gZHJpdmVyIGJvb3RzdHJhcCBmdW5jdGlvbnMgKi8Kc3RhdGljIHZvaWQKU1VOQVVESU9fRGV0ZWN0RGV2aWNlcyh2b2lkKQp7CiAgICBTRExfRW51bVVuaXhBdWRpb0RldmljZXMoMSwgKGludCAoKikoaW50KSkgTlVMTCk7Cn0KCiNpZmRlZiBERUJVR19BVURJTwp2b2lkCkNoZWNrVW5kZXJmbG93KF9USElTKQp7CiNpZmRlZiBBVURJT19HRVRCVUZJTkZPCiAgICBhdWRpb19pbmZvX3QgaW5mbzsKICAgIGludCBsZWZ0OwoKICAgIGlvY3RsKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsIEFVRElPX0dFVEJVRklORk8sICZpbmZvKTsKICAgIGxlZnQgPSAodGhpcy0+aGlkZGVuLT53cml0dGVuIC0gaW5mby5wbGF5LnNhbXBsZXMpOwogICAgaWYgKHRoaXMtPmhpZGRlbi0+d3JpdHRlbiAmJiAobGVmdCA9PSAwKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiYXVkaW8gdW5kZXJmbG93IVxuIik7CiAgICB9CiNlbmRpZgp9CiNlbmRpZgoKc3RhdGljIHZvaWQKU1VOQVVESU9fV2FpdERldmljZShfVEhJUykKewojaWZkZWYgQVVESU9fR0VUQlVGSU5GTwojZGVmaW5lIFNMRUVQX0ZVREdFIDEwICAgICAgLyogMTAgbXMgc2NoZWR1bGluZyBmdWRnZSBmYWN0b3IgKi8KICAgIGF1ZGlvX2luZm9fdCBpbmZvOwogICAgU2ludDMyIGxlZnQ7CgogICAgaW9jdGwodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgQVVESU9fR0VUQlVGSU5GTywgJmluZm8pOwogICAgbGVmdCA9ICh0aGlzLT5oaWRkZW4tPndyaXR0ZW4gLSBpbmZvLnBsYXkuc2FtcGxlcyk7CiAgICBpZiAobGVmdCA+IHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpIHsKICAgICAgICBTaW50MzIgc2xlZXB5OwoKICAgICAgICBzbGVlcHkgPSAoKGxlZnQgLSB0aGlzLT5oaWRkZW4tPmZyYWdzaXplKSAvIHRoaXMtPmhpZGRlbi0+ZnJlcXVlbmN5KTsKICAgICAgICBzbGVlcHkgLT0gU0xFRVBfRlVER0U7CiAgICAgICAgaWYgKHNsZWVweSA+IDApIHsKICAgICAgICAgICAgU0RMX0RlbGF5KHNsZWVweSk7CiAgICAgICAgfQogICAgfQojZWxzZQogICAgZmRfc2V0IGZkc2V0OwoKICAgIEZEX1pFUk8oJmZkc2V0KTsKICAgIEZEX1NFVCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCAmZmRzZXQpOwogICAgc2VsZWN0KHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQgKyAxLCBOVUxMLCAmZmRzZXQsIE5VTEwsIE5VTEwpOwojZW5kaWYKfQoKc3RhdGljIHZvaWQKU1VOQVVESU9fUGxheURldmljZShfVEhJUykKewogICAgLyogV3JpdGUgdGhlIGF1ZGlvIGRhdGEgKi8KICAgIGlmICh0aGlzLT5oaWRkZW4tPnVsYXdfb25seSkgewogICAgICAgIC8qIEFzc3VtaW5nIHRoYXQgdGhpcy0+c3BlYy5mcmVxID49IDgwMDAgSHogKi8KICAgICAgICBpbnQgYWNjdW0sIGluY3IsIHBvczsKICAgICAgICBVaW50OCAqYXVidWY7CgogICAgICAgIGFjY3VtID0gMDsKICAgICAgICBpbmNyID0gdGhpcy0+c3BlYy5mcmVxIC8gODsKICAgICAgICBhdWJ1ZiA9IHRoaXMtPmhpZGRlbi0+dWxhd19idWY7CiAgICAgICAgc3dpdGNoICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZtdCAmIDB4RkYpIHsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVpbnQ4ICpzbmRidWY7CgogICAgICAgICAgICAgICAgc25kYnVmID0gdGhpcy0+aGlkZGVuLT5taXhidWY7CiAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemU7ICsrcG9zKSB7CiAgICAgICAgICAgICAgICAgICAgKmF1YnVmID0gc25kMmF1KCgweDgwIC0gKnNuZGJ1ZikgKiA2NCk7CiAgICAgICAgICAgICAgICAgICAgYWNjdW0gKz0gaW5jcjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYWNjdW0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtIC09IDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHNuZGJ1ZiArPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhdWJ1ZiArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFNpbnQxNiAqc25kYnVmOwoKICAgICAgICAgICAgICAgIHNuZGJ1ZiA9IChTaW50MTYgKikgdGhpcy0+aGlkZGVuLT5taXhidWY7CiAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemU7ICsrcG9zKSB7CiAgICAgICAgICAgICAgICAgICAgKmF1YnVmID0gc25kMmF1KCpzbmRidWYgLyA0KTsKICAgICAgICAgICAgICAgICAgICBhY2N1bSArPSBpbmNyOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChhY2N1bSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0gLT0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgc25kYnVmICs9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGF1YnVmICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojaWZkZWYgREVCVUdfQVVESU8KICAgICAgICBDaGVja1VuZGVyZmxvdyh0aGlzKTsKI2VuZGlmCiAgICAgICAgaWYgKHdyaXRlKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsIHRoaXMtPmhpZGRlbi0+dWxhd19idWYsCiAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpIDwgMCkgewogICAgICAgICAgICAvKiBBc3N1bWUgZmF0YWwgZXJyb3IsIGZvciBub3cgKi8KICAgICAgICAgICAgU0RMX09wZW5lZEF1ZGlvRGV2aWNlRGlzY29ubmVjdGVkKHRoaXMpOwogICAgICAgIH0KICAgICAgICB0aGlzLT5oaWRkZW4tPndyaXR0ZW4gKz0gdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZTsKICAgIH0gZWxzZSB7CiNpZmRlZiBERUJVR19BVURJTwogICAgICAgIENoZWNrVW5kZXJmbG93KHRoaXMpOwojZW5kaWYKICAgICAgICBpZiAod3JpdGUodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgdGhpcy0+aGlkZGVuLT5taXhidWYsCiAgICAgICAgICAgIHRoaXMtPnNwZWMuc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgIC8qIEFzc3VtZSBmYXRhbCBlcnJvciwgZm9yIG5vdyAqLwogICAgICAgICAgICBTRExfT3BlbmVkQXVkaW9EZXZpY2VEaXNjb25uZWN0ZWQodGhpcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMtPmhpZGRlbi0+d3JpdHRlbiArPSB0aGlzLT5oaWRkZW4tPmZyYWdzaXplOwogICAgfQp9CgpzdGF0aWMgVWludDggKgpTVU5BVURJT19HZXREZXZpY2VCdWYoX1RISVMpCnsKICAgIHJldHVybiAodGhpcy0+aGlkZGVuLT5taXhidWYpOwp9CgpzdGF0aWMgdm9pZApTVU5BVURJT19DbG9zZURldmljZShfVEhJUykKewogICAgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT51bGF3X2J1Zik7CiAgICBpZiAodGhpcy0+aGlkZGVuLT5hdWRpb19mZCA+PSAwKSB7CiAgICAgICAgY2xvc2UodGhpcy0+aGlkZGVuLT5hdWRpb19mZCk7CiAgICB9CiAgICBTRExfZnJlZSh0aGlzLT5oaWRkZW4tPm1peGJ1Zik7CiAgICBTRExfZnJlZSh0aGlzLT5oaWRkZW4pOwp9CgpzdGF0aWMgaW50ClNVTkFVRElPX09wZW5EZXZpY2UoX1RISVMsIHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IGlzY2FwdHVyZSkKewogICAgY29uc3QgaW50IGZsYWdzID0gKChpc2NhcHR1cmUpID8gT1BFTl9GTEFHU19JTlBVVCA6IE9QRU5fRkxBR1NfT1VUUFVUKTsKICAgIFNETF9BdWRpb0Zvcm1hdCBmb3JtYXQgPSAwOwogICAgYXVkaW9faW5mb190IGluZm87CgogICAgLyogV2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBkZXZuYW1lIGlzLi4ud2UnbGwgdHJ5IHRvIG9wZW4gYW55dGhpbmcuICovCiAgICAvKiAgLi4uYnV0IGRlZmF1bHQgdG8gZmlyc3QgbmFtZSBpbiB0aGUgbGlzdC4uLiAqLwogICAgaWYgKGRldm5hbWUgPT0gTlVMTCkgewogICAgICAgIGRldm5hbWUgPSBTRExfR2V0QXVkaW9EZXZpY2VOYW1lKDAsIGlzY2FwdHVyZSk7CiAgICAgICAgaWYgKGRldm5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJObyBzdWNoIGF1ZGlvIGRldmljZSIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwogICAgdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQogICAgICAgIFNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CiAgICBpZiAodGhpcy0+aGlkZGVuID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICBTRExfemVyb3AodGhpcy0+aGlkZGVuKTsKCiAgICAvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KICAgIHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQgPSBvcGVuKGRldm5hbWUsIGZsYWdzLCAwKTsKICAgIGlmICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkIDwgMCkgewogICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgZGV2bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgIH0KCiNpZmRlZiBBVURJT19TRVRJTkZPCiAgICBpbnQgZW5jOwojZW5kaWYKICAgIGludCBkZXNpcmVkX2ZyZXEgPSB0aGlzLT5zcGVjLmZyZXE7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLwogICAgc3dpdGNoIChTRExfQVVESU9fQklUU0laRSh0aGlzLT5zcGVjLmZvcm1hdCkpIHsKCiAgICBjYXNlIDg6CiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogVW5zaWduZWQgOCBiaXQgYXVkaW8gZGF0YSAqLwogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCA9IEFVRElPX1U4OwojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI4OwojZW5kaWYKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAxNjoKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KICAgICAgICAgICAgdGhpcy0+c3BlYy5mb3JtYXQgPSBBVURJT19TMTZTWVM7CiNpZmRlZiBBVURJT19TRVRJTkZPCiAgICAgICAgICAgIGVuYyA9IEFVRElPX0VOQ09ESU5HX0xJTkVBUjsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgICAvKiAhISEgRklYTUU6IGZhbGxiYWNrIHRvIGNvbnZlcnNpb24gb24gdW5zdXBwb3J0ZWQgdHlwZXMhICovCiAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMtPmhpZGRlbi0+YXVkaW9fZm10ID0gdGhpcy0+c3BlYy5mb3JtYXQ7CgogICAgdGhpcy0+aGlkZGVuLT51bGF3X29ubHkgPSAwOyAgICAvKiBtb2Rlcm4gU3VucyBkbyBzdXBwb3J0IGxpbmVhciBhdWRpbyAqLwojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgZm9yICg7OykgewogICAgICAgIGF1ZGlvX2luZm9fdCBpbmZvOwogICAgICAgIEFVRElPX0lOSVRJTkZPKCZpbmZvKTsgIC8qIGluaXQgYWxsIGZpZWxkcyB0byAibm8gY2hhbmdlIiAqLwoKICAgICAgICAvKiBUcnkgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgc2V0dGluZ3MgKi8KICAgICAgICBpbmZvLnBsYXkuc2FtcGxlX3JhdGUgPSB0aGlzLT5zcGVjLmZyZXE7CiAgICAgICAgaW5mby5wbGF5LmNoYW5uZWxzID0gdGhpcy0+c3BlYy5jaGFubmVsczsKICAgICAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gKGVuYyA9PSBBVURJT19FTkNPRElOR19VTEFXKQogICAgICAgICAgICA/IDggOiB0aGlzLT5zcGVjLmZvcm1hdCAmIDB4ZmY7CiAgICAgICAgaW5mby5wbGF5LmVuY29kaW5nID0gZW5jOwogICAgICAgIGlmIChpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbykgPT0gMCkgewoKICAgICAgICAgICAgLyogQ2hlY2sgdG8gYmUgc3VyZSB3ZSBnb3Qgd2hhdCB3ZSB3YW50ZWQgKi8KICAgICAgICAgICAgaWYgKGlvY3RsKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsIEFVRElPX0dFVElORk8sICZpbmZvKSA8IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkVycm9yIGdldHRpbmcgYXVkaW8gcGFyYW1ldGVyczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLnBsYXkuZW5jb2RpbmcgPT0gZW5jCiAgICAgICAgICAgICAgICAmJiBpbmZvLnBsYXkucHJlY2lzaW9uID09ICh0aGlzLT5zcGVjLmZvcm1hdCAmIDB4ZmYpCiAgICAgICAgICAgICAgICAmJiBpbmZvLnBsYXkuY2hhbm5lbHMgPT0gdGhpcy0+c3BlYy5jaGFubmVscykgewogICAgICAgICAgICAgICAgLyogWW93ISBBbGwgc2VlbXMgdG8gYmUgd2VsbCEgKi8KICAgICAgICAgICAgICAgIHRoaXMtPnNwZWMuZnJlcSA9IGluZm8ucGxheS5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKGVuYykgewogICAgICAgIGNhc2UgQVVESU9fRU5DT0RJTkdfTElORUFSODoKICAgICAgICAgICAgLyogdW5zaWduZWQgOGJpdCBhcHBhcmVudGx5IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI7CiAgICAgICAgICAgIHRoaXMtPnNwZWMuZm9ybWF0ID0gQVVESU9fUzE2U1lTOwogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIHRyeSBhZ2FpbiAqLwoKICAgICAgICBjYXNlIEFVRElPX0VOQ09ESU5HX0xJTkVBUjoKICAgICAgICAgICAgLyogbGluZWFyIDE2Yml0IGRpZG4ndCB3b3JrIGVpdGhlciwgcmVzb3J0IHRvILUtbGF3ICovCiAgICAgICAgICAgIGVuYyA9IEFVRElPX0VOQ09ESU5HX1VMQVc7CiAgICAgICAgICAgIHRoaXMtPnNwZWMuY2hhbm5lbHMgPSAxOwogICAgICAgICAgICB0aGlzLT5zcGVjLmZyZXEgPSA4MDAwOwogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCA9IEFVRElPX1U4OwogICAgICAgICAgICB0aGlzLT5oaWRkZW4tPnVsYXdfb25seSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBvaCB3ZWxsLi4uICovCiAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkVycm9yIHNldHRpbmcgYXVkaW8gcGFyYW1ldGVyczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgfQogICAgfQojZW5kaWYgLyogQVVESU9fU0VUSU5GTyAqLwogICAgdGhpcy0+aGlkZGVuLT53cml0dGVuID0gMDsKCiAgICAvKiBXZSBjYW4gYWN0dWFsbHkgY29udmVydCBvbi10aGUtZmx5IHRvIFUtTGF3ICovCiAgICBpZiAodGhpcy0+aGlkZGVuLT51bGF3X29ubHkpIHsKICAgICAgICB0aGlzLT5zcGVjLmZyZXEgPSBkZXNpcmVkX2ZyZXE7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSA9ICh0aGlzLT5zcGVjLnNhbXBsZXMgKiAxMDAwKSAvCiAgICAgICAgICAgICh0aGlzLT5zcGVjLmZyZXEgLyA4KTsKICAgICAgICB0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jeSA9IDg7CiAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X2J1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpOwogICAgICAgIGlmICh0aGlzLT5oaWRkZW4tPnVsYXdfYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLT5zcGVjLmNoYW5uZWxzID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSA9IHRoaXMtPnNwZWMuc2FtcGxlczsKICAgICAgICB0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jeSA9IHRoaXMtPnNwZWMuZnJlcSAvIDEwMDA7CiAgICB9CiNpZmRlZiBERUJVR19BVURJTwogICAgZnByaW50ZihzdGRlcnIsICJBdWRpbyBkZXZpY2UgJXMgVS1MYXcgb25seVxuIiwKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X29ubHkgPyAiaXMiIDogImlzIG5vdCIpOwogICAgZnByaW50ZihzdGRlcnIsICJmb3JtYXQ9MHgleCBjaGFuPSVkIGZyZXE9JWRcbiIsCiAgICAgICAgICAgIHRoaXMtPnNwZWMuZm9ybWF0LCB0aGlzLT5zcGVjLmNoYW5uZWxzLCB0aGlzLT5zcGVjLmZyZXEpOwojZW5kaWYKCiAgICAvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwogICAgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYygmdGhpcy0+c3BlYyk7CgogICAgLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLwogICAgdGhpcy0+aGlkZGVuLT5taXhidWYgPSAoVWludDggKikgU0RMX21hbGxvYyh0aGlzLT5zcGVjLnNpemUpOwogICAgaWYgKHRoaXMtPmhpZGRlbi0+bWl4YnVmID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbi0+bWl4YnVmLCB0aGlzLT5zcGVjLnNpbGVuY2UsIHRoaXMtPnNwZWMuc2l6ZSk7CgogICAgLyogV2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbC4gOi0pICovCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVGhpcyBmdW5jdGlvbiAoc25kMmF1KCkpIGNvcHlyaWdodGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICBDb3B5cmlnaHQgMTk4OSBieSBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlICAgKi8KLyogICAgICBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyAgICAgICAgKi8KLyogICAgICBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSAgICAgICAgKi8KLyogICAgICBhcHBlYXJzIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kICAgKi8KLyogICAgICB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCAgKi8KLyogICAgICB0aGF0IHRoZSBuYW1lIG9mIFJpY2ggR29wc3RlaW4gYW5kIEhhcnJpcyBDb3Jwb3JhdGlvbiBub3QgYmUgICAgKi8KLyogICAgICB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAgICAgKi8KLyogICAgICBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgICAgKi8KLyogICAgICBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gbWFrZSBubyByZXByZXNlbnRhdGlvbnMgICAgKi8KLyogICAgICBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCAgICAgKi8KLyogICAgICBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBVaW50OApzbmQyYXUoaW50IHNhbXBsZSkKewoKICAgIGludCBtYXNrOwoKICAgIGlmIChzYW1wbGUgPCAwKSB7CiAgICAgICAgc2FtcGxlID0gLXNhbXBsZTsKICAgICAgICBtYXNrID0gMHg3ZjsKICAgIH0gZWxzZSB7CiAgICAgICAgbWFzayA9IDB4ZmY7CiAgICB9CgogICAgaWYgKHNhbXBsZSA8IDMyKSB7CiAgICAgICAgc2FtcGxlID0gMHhGMCB8ICgxNSAtIHNhbXBsZSAvIDIpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCA5NikgewogICAgICAgIHNhbXBsZSA9IDB4RTAgfCAoMTUgLSAoc2FtcGxlIC0gMzIpIC8gNCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDIyNCkgewogICAgICAgIHNhbXBsZSA9IDB4RDAgfCAoMTUgLSAoc2FtcGxlIC0gOTYpIC8gOCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDQ4MCkgewogICAgICAgIHNhbXBsZSA9IDB4QzAgfCAoMTUgLSAoc2FtcGxlIC0gMjI0KSAvIDE2KTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgOTkyKSB7CiAgICAgICAgc2FtcGxlID0gMHhCMCB8ICgxNSAtIChzYW1wbGUgLSA0ODApIC8gMzIpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCAyMDE2KSB7CiAgICAgICAgc2FtcGxlID0gMHhBMCB8ICgxNSAtIChzYW1wbGUgLSA5OTIpIC8gNjQpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCA0MDY0KSB7CiAgICAgICAgc2FtcGxlID0gMHg5MCB8ICgxNSAtIChzYW1wbGUgLSAyMDE2KSAvIDEyOCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDgxNjApIHsKICAgICAgICBzYW1wbGUgPSAweDgwIHwgKDE1IC0gKHNhbXBsZSAtIDQwNjQpIC8gMjU2KTsKICAgIH0gZWxzZSB7CiAgICAgICAgc2FtcGxlID0gMHg4MDsKICAgIH0KICAgIHJldHVybiAobWFzayAmIHNhbXBsZSk7Cn0KCnN0YXRpYyBpbnQKU1VOQVVESU9fSW5pdChTRExfQXVkaW9Ecml2ZXJJbXBsICogaW1wbCkKewogICAgLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLwogICAgaW1wbC0+RGV0ZWN0RGV2aWNlcyA9IFNVTkFVRElPX0RldGVjdERldmljZXM7CiAgICBpbXBsLT5PcGVuRGV2aWNlID0gU1VOQVVESU9fT3BlbkRldmljZTsKICAgIGltcGwtPlBsYXlEZXZpY2UgPSBTVU5BVURJT19QbGF5RGV2aWNlOwogICAgaW1wbC0+V2FpdERldmljZSA9IFNVTkFVRElPX1dhaXREZXZpY2U7CiAgICBpbXBsLT5HZXREZXZpY2VCdWYgPSBTVU5BVURJT19HZXREZXZpY2VCdWY7CiAgICBpbXBsLT5DbG9zZURldmljZSA9IFNVTkFVRElPX0Nsb3NlRGV2aWNlOwoKICAgIGltcGwtPkFsbG93c0FyYml0cmFyeURldmljZU5hbWVzID0gMTsKCiAgICByZXR1cm4gMTsgLyogdGhpcyBhdWRpbyB0YXJnZXQgaXMgYXZhaWxhYmxlLiAqLwp9CgpBdWRpb0Jvb3RTdHJhcCBTVU5BVURJT19ib290c3RyYXAgPSB7CiAgICAiYXVkaW8iLCAiVU5JWCAvZGV2L2F1ZGlvIGludGVyZmFjZSIsIFNVTkFVRElPX0luaXQsIDAKfTsKCiNlbmRpZiAvKiBTRExfQVVESU9fRFJJVkVSX1NVTkFVRElPICovCgovKiB2aTogc2V0IHRzPTQgc3c9NCBleHBhbmR0YWI6ICovCg==