LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNCBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uLy4uL1NETF9pbnRlcm5hbC5oIgoKI2lmIFNETF9BVURJT19EUklWRVJfU1VOQVVESU8KCi8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBfX05FVEJTRF9fCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+CiNlbmRpZgojaWZkZWYgX19TVlI0CiNpbmNsdWRlIDxzeXMvYXVkaW9pby5oPgojZWxzZQojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIlNETF90aW1lci5oIgojaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCiNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCiNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgojaW5jbHVkZSAiU0RMX3N1bmF1ZGlvLmgiCgovKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLCBhbmQgZG9uJ3QgYmxvY2sgaWYgYnVzeSAqLwoKI2lmIGRlZmluZWQoQVVESU9fR0VUSU5GTykgJiYgIWRlZmluZWQoQVVESU9fR0VUQlVGSU5GTykKI2RlZmluZSBBVURJT19HRVRCVUZJTkZPIEFVRElPX0dFVElORk8KI2VuZGlmCgovKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCnN0YXRpYyBVaW50OCBzbmQyYXUoaW50IHNhbXBsZSk7CgovKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZApTVU5BVURJT19EZXRlY3REZXZpY2VzKGludCBpc2NhcHR1cmUsIFNETF9BZGRBdWRpb0RldmljZSBhZGRmbikKewogICAgU0RMX0VudW1Vbml4QXVkaW9EZXZpY2VzKGlzY2FwdHVyZSwgMSwgKGludCAoKikoaW50IGZkKSkgTlVMTCwgYWRkZm4pOwp9CgojaWZkZWYgREVCVUdfQVVESU8Kdm9pZApDaGVja1VuZGVyZmxvdyhfVEhJUykKewojaWZkZWYgQVVESU9fR0VUQlVGSU5GTwogICAgYXVkaW9faW5mb190IGluZm87CiAgICBpbnQgbGVmdDsKCiAgICBpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBBVURJT19HRVRCVUZJTkZPLCAmaW5mbyk7CiAgICBsZWZ0ID0gKHRoaXMtPmhpZGRlbi0+d3JpdHRlbiAtIGluZm8ucGxheS5zYW1wbGVzKTsKICAgIGlmICh0aGlzLT5oaWRkZW4tPndyaXR0ZW4gJiYgKGxlZnQgPT0gMCkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImF1ZGlvIHVuZGVyZmxvdyFcbiIpOwogICAgfQojZW5kaWYKfQojZW5kaWYKCnN0YXRpYyB2b2lkClNVTkFVRElPX1dhaXREZXZpY2UoX1RISVMpCnsKI2lmZGVmIEFVRElPX0dFVEJVRklORk8KI2RlZmluZSBTTEVFUF9GVURHRSAxMCAgICAgIC8qIDEwIG1zIHNjaGVkdWxpbmcgZnVkZ2UgZmFjdG9yICovCiAgICBhdWRpb19pbmZvX3QgaW5mbzsKICAgIFNpbnQzMiBsZWZ0OwoKICAgIGlvY3RsKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsIEFVRElPX0dFVEJVRklORk8sICZpbmZvKTsKICAgIGxlZnQgPSAodGhpcy0+aGlkZGVuLT53cml0dGVuIC0gaW5mby5wbGF5LnNhbXBsZXMpOwogICAgaWYgKGxlZnQgPiB0aGlzLT5oaWRkZW4tPmZyYWdzaXplKSB7CiAgICAgICAgU2ludDMyIHNsZWVweTsKCiAgICAgICAgc2xlZXB5ID0gKChsZWZ0IC0gdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSkgLyB0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jeSk7CiAgICAgICAgc2xlZXB5IC09IFNMRUVQX0ZVREdFOwogICAgICAgIGlmIChzbGVlcHkgPiAwKSB7CiAgICAgICAgICAgIFNETF9EZWxheShzbGVlcHkpOwogICAgICAgIH0KICAgIH0KI2Vsc2UKICAgIGZkX3NldCBmZHNldDsKCiAgICBGRF9aRVJPKCZmZHNldCk7CiAgICBGRF9TRVQodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgJmZkc2V0KTsKICAgIHNlbGVjdCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkICsgMSwgTlVMTCwgJmZkc2V0LCBOVUxMLCBOVUxMKTsKI2VuZGlmCn0KCnN0YXRpYyB2b2lkClNVTkFVRElPX1BsYXlEZXZpY2UoX1RISVMpCnsKICAgIC8qIFdyaXRlIHRoZSBhdWRpbyBkYXRhICovCiAgICBpZiAodGhpcy0+aGlkZGVuLT51bGF3X29ubHkpIHsKICAgICAgICAvKiBBc3N1bWluZyB0aGF0IHRoaXMtPnNwZWMuZnJlcSA+PSA4MDAwIEh6ICovCiAgICAgICAgaW50IGFjY3VtLCBpbmNyLCBwb3M7CiAgICAgICAgVWludDggKmF1YnVmOwoKICAgICAgICBhY2N1bSA9IDA7CiAgICAgICAgaW5jciA9IHRoaXMtPnNwZWMuZnJlcSAvIDg7CiAgICAgICAgYXVidWYgPSB0aGlzLT5oaWRkZW4tPnVsYXdfYnVmOwogICAgICAgIHN3aXRjaCAodGhpcy0+aGlkZGVuLT5hdWRpb19mbXQgJiAweEZGKSB7CiAgICAgICAgY2FzZSA4OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVaW50OCAqc25kYnVmOwoKICAgICAgICAgICAgICAgIHNuZGJ1ZiA9IHRoaXMtPmhpZGRlbi0+bWl4YnVmOwogICAgICAgICAgICAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCB0aGlzLT5oaWRkZW4tPmZyYWdzaXplOyArK3BvcykgewogICAgICAgICAgICAgICAgICAgICphdWJ1ZiA9IHNuZDJhdSgoMHg4MCAtICpzbmRidWYpICogNjQpOwogICAgICAgICAgICAgICAgICAgIGFjY3VtICs9IGluY3I7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFjY3VtID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSAtPSAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICBzbmRidWYgKz0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXVidWYgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTaW50MTYgKnNuZGJ1ZjsKCiAgICAgICAgICAgICAgICBzbmRidWYgPSAoU2ludDE2ICopIHRoaXMtPmhpZGRlbi0+bWl4YnVmOwogICAgICAgICAgICAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCB0aGlzLT5oaWRkZW4tPmZyYWdzaXplOyArK3BvcykgewogICAgICAgICAgICAgICAgICAgICphdWJ1ZiA9IHNuZDJhdSgqc25kYnVmIC8gNCk7CiAgICAgICAgICAgICAgICAgICAgYWNjdW0gKz0gaW5jcjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYWNjdW0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtIC09IDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHNuZGJ1ZiArPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhdWJ1ZiArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2lmZGVmIERFQlVHX0FVRElPCiAgICAgICAgQ2hlY2tVbmRlcmZsb3codGhpcyk7CiNlbmRpZgogICAgICAgIGlmICh3cml0ZSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCB0aGlzLT5oaWRkZW4tPnVsYXdfYnVmLAogICAgICAgICAgICB0aGlzLT5oaWRkZW4tPmZyYWdzaXplKSA8IDApIHsKICAgICAgICAgICAgLyogQXNzdW1lIGZhdGFsIGVycm9yLCBmb3Igbm93ICovCiAgICAgICAgICAgIHRoaXMtPmVuYWJsZWQgPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLT5oaWRkZW4tPndyaXR0ZW4gKz0gdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZTsKICAgIH0gZWxzZSB7CiNpZmRlZiBERUJVR19BVURJTwogICAgICAgIENoZWNrVW5kZXJmbG93KHRoaXMpOwojZW5kaWYKICAgICAgICBpZiAod3JpdGUodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgdGhpcy0+aGlkZGVuLT5taXhidWYsCiAgICAgICAgICAgIHRoaXMtPnNwZWMuc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgIC8qIEFzc3VtZSBmYXRhbCBlcnJvciwgZm9yIG5vdyAqLwogICAgICAgICAgICB0aGlzLT5lbmFibGVkID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy0+aGlkZGVuLT53cml0dGVuICs9IHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemU7CiAgICB9Cn0KCnN0YXRpYyBVaW50OCAqClNVTkFVRElPX0dldERldmljZUJ1ZihfVEhJUykKewogICAgcmV0dXJuICh0aGlzLT5oaWRkZW4tPm1peGJ1Zik7Cn0KCnN0YXRpYyB2b2lkClNVTkFVRElPX0Nsb3NlRGV2aWNlKF9USElTKQp7CiAgICBpZiAodGhpcy0+aGlkZGVuICE9IE5VTEwpIHsKICAgICAgICBTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKICAgICAgICB0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IE5VTEw7CiAgICAgICAgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT51bGF3X2J1Zik7CiAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X2J1ZiA9IE5VTEw7CiAgICAgICAgaWYgKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQgPj0gMCkgewogICAgICAgICAgICBjbG9zZSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKTsKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5hdWRpb19mZCA9IC0xOwogICAgICAgIH0KICAgICAgICBTRExfZnJlZSh0aGlzLT5oaWRkZW4pOwogICAgICAgIHRoaXMtPmhpZGRlbiA9IE5VTEw7CiAgICB9Cn0KCnN0YXRpYyBpbnQKU1VOQVVESU9fT3BlbkRldmljZShfVEhJUywgY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IGlzY2FwdHVyZSkKewogICAgY29uc3QgaW50IGZsYWdzID0gKChpc2NhcHR1cmUpID8gT1BFTl9GTEFHU19JTlBVVCA6IE9QRU5fRkxBR1NfT1VUUFVUKTsKICAgIFNETF9BdWRpb0Zvcm1hdCBmb3JtYXQgPSAwOwogICAgYXVkaW9faW5mb190IGluZm87CgogICAgLyogV2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBkZXZuYW1lIGlzLi4ud2UnbGwgdHJ5IHRvIG9wZW4gYW55dGhpbmcuICovCiAgICAvKiAgLi4uYnV0IGRlZmF1bHQgdG8gZmlyc3QgbmFtZSBpbiB0aGUgbGlzdC4uLiAqLwogICAgaWYgKGRldm5hbWUgPT0gTlVMTCkgewogICAgICAgIGRldm5hbWUgPSBTRExfR2V0QXVkaW9EZXZpY2VOYW1lKDAsIGlzY2FwdHVyZSk7CiAgICAgICAgaWYgKGRldm5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJObyBzdWNoIGF1ZGlvIGRldmljZSIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJbml0aWFsaXplIGFsbCB2YXJpYWJsZXMgdGhhdCB3ZSBjbGVhbiBvbiBzaHV0ZG93biAqLwogICAgdGhpcy0+aGlkZGVuID0gKHN0cnVjdCBTRExfUHJpdmF0ZUF1ZGlvRGF0YSAqKQogICAgICAgIFNETF9tYWxsb2MoKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CiAgICBpZiAodGhpcy0+aGlkZGVuID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICBTRExfbWVtc2V0KHRoaXMtPmhpZGRlbiwgMCwgKHNpemVvZiAqdGhpcy0+aGlkZGVuKSk7CgogICAgLyogT3BlbiB0aGUgYXVkaW8gZGV2aWNlICovCiAgICB0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkID0gb3BlbihkZXZuYW1lLCBmbGFncywgMCk7CiAgICBpZiAodGhpcy0+aGlkZGVuLT5hdWRpb19mZCA8IDApIHsKICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJDb3VsZG4ndCBvcGVuICVzOiAlcyIsIGRldm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CiAgICB9CgojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgaW50IGVuYzsKI2VuZGlmCiAgICBpbnQgZGVzaXJlZF9mcmVxID0gdGhpcy0+c3BlYy5mcmVxOwoKICAgIC8qIERldGVybWluZSB0aGUgYXVkaW8gcGFyYW1ldGVycyBmcm9tIHRoZSBBdWRpb1NwZWMgKi8KICAgIHN3aXRjaCAoU0RMX0FVRElPX0JJVFNJWkUodGhpcy0+c3BlYy5mb3JtYXQpKSB7CgogICAgY2FzZSA4OgogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIDggYml0IGF1ZGlvIGRhdGEgKi8KICAgICAgICAgICAgdGhpcy0+c3BlYy5mb3JtYXQgPSBBVURJT19VODsKI2lmZGVmIEFVRElPX1NFVElORk8KICAgICAgICAgICAgZW5jID0gQVVESU9fRU5DT0RJTkdfTElORUFSODsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMTY6CiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogU2lnbmVkIDE2IGJpdCBhdWRpbyBkYXRhICovCiAgICAgICAgICAgIHRoaXMtPnNwZWMuZm9ybWF0ID0gQVVESU9fUzE2U1lTOwojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI7CiNlbmRpZgogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgICAgLyogISEhIEZJWE1FOiBmYWxsYmFjayB0byBjb252ZXJzaW9uIG9uIHVuc3VwcG9ydGVkIHR5cGVzISAqLwogICAgICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZtdCA9IHRoaXMtPnNwZWMuZm9ybWF0OwoKICAgIHRoaXMtPmhpZGRlbi0+dWxhd19vbmx5ID0gMDsgICAgLyogbW9kZXJuIFN1bnMgZG8gc3VwcG9ydCBsaW5lYXIgYXVkaW8gKi8KI2lmZGVmIEFVRElPX1NFVElORk8KICAgIGZvciAoOzspIHsKICAgICAgICBhdWRpb19pbmZvX3QgaW5mbzsKICAgICAgICBBVURJT19JTklUSU5GTygmaW5mbyk7ICAvKiBpbml0IGFsbCBmaWVsZHMgdG8gIm5vIGNoYW5nZSIgKi8KCiAgICAgICAgLyogVHJ5IHRvIHNldCB0aGUgcmVxdWVzdGVkIHNldHRpbmdzICovCiAgICAgICAgaW5mby5wbGF5LnNhbXBsZV9yYXRlID0gdGhpcy0+c3BlYy5mcmVxOwogICAgICAgIGluZm8ucGxheS5jaGFubmVscyA9IHRoaXMtPnNwZWMuY2hhbm5lbHM7CiAgICAgICAgaW5mby5wbGF5LnByZWNpc2lvbiA9IChlbmMgPT0gQVVESU9fRU5DT0RJTkdfVUxBVykKICAgICAgICAgICAgPyA4IDogdGhpcy0+c3BlYy5mb3JtYXQgJiAweGZmOwogICAgICAgIGluZm8ucGxheS5lbmNvZGluZyA9IGVuYzsKICAgICAgICBpZiAoaW9jdGwodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgQVVESU9fU0VUSU5GTywgJmluZm8pID09IDApIHsKCiAgICAgICAgICAgIC8qIENoZWNrIHRvIGJlIHN1cmUgd2UgZ290IHdoYXQgd2Ugd2FudGVkICovCiAgICAgICAgICAgIGlmIChpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBBVURJT19HRVRJTkZPLCAmaW5mbykgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJFcnJvciBnZXR0aW5nIGF1ZGlvIHBhcmFtZXRlcnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5mby5wbGF5LmVuY29kaW5nID09IGVuYwogICAgICAgICAgICAgICAgJiYgaW5mby5wbGF5LnByZWNpc2lvbiA9PSAodGhpcy0+c3BlYy5mb3JtYXQgJiAweGZmKQogICAgICAgICAgICAgICAgJiYgaW5mby5wbGF5LmNoYW5uZWxzID09IHRoaXMtPnNwZWMuY2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgIC8qIFlvdyEgQWxsIHNlZW1zIHRvIGJlIHdlbGwhICovCiAgICAgICAgICAgICAgICB0aGlzLT5zcGVjLmZyZXEgPSBpbmZvLnBsYXkuc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChlbmMpIHsKICAgICAgICBjYXNlIEFVRElPX0VOQ09ESU5HX0xJTkVBUjg6CiAgICAgICAgICAgIC8qIHVuc2lnbmVkIDhiaXQgYXBwYXJlbnRseSBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KICAgICAgICAgICAgZW5jID0gQVVESU9fRU5DT0RJTkdfTElORUFSOwogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCA9IEFVRElPX1MxNlNZUzsKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiB0cnkgYWdhaW4gKi8KCiAgICAgICAgY2FzZSBBVURJT19FTkNPRElOR19MSU5FQVI6CiAgICAgICAgICAgIC8qIGxpbmVhciAxNmJpdCBkaWRuJ3Qgd29yayBlaXRoZXIsIHJlc29ydCB0byC1LWxhdyAqLwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19VTEFXOwogICAgICAgICAgICB0aGlzLT5zcGVjLmNoYW5uZWxzID0gMTsKICAgICAgICAgICAgdGhpcy0+c3BlYy5mcmVxID0gODAwMDsKICAgICAgICAgICAgdGhpcy0+c3BlYy5mb3JtYXQgPSBBVURJT19VODsKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X29ubHkgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyogb2ggd2VsbC4uLiAqLwogICAgICAgICAgICByZXR1cm4gU0RMX1NldEVycm9yKCJFcnJvciBzZXR0aW5nIGF1ZGlvIHBhcmFtZXRlcnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwogICAgICAgIH0KICAgIH0KI2VuZGlmIC8qIEFVRElPX1NFVElORk8gKi8KICAgIHRoaXMtPmhpZGRlbi0+d3JpdHRlbiA9IDA7CgogICAgLyogV2UgY2FuIGFjdHVhbGx5IGNvbnZlcnQgb24tdGhlLWZseSB0byBVLUxhdyAqLwogICAgaWYgKHRoaXMtPmhpZGRlbi0+dWxhd19vbmx5KSB7CiAgICAgICAgdGhpcy0+c3BlYy5mcmVxID0gZGVzaXJlZF9mcmVxOwogICAgICAgIHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUgPSAodGhpcy0+c3BlYy5zYW1wbGVzICogMTAwMCkgLwogICAgICAgICAgICAodGhpcy0+c3BlYy5mcmVxIC8gOCk7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmVxdWVuY3kgPSA4OwogICAgICAgIHRoaXMtPmhpZGRlbi0+dWxhd19idWYgPSAoVWludDggKikgU0RMX21hbGxvYyh0aGlzLT5oaWRkZW4tPmZyYWdzaXplKTsKICAgICAgICBpZiAodGhpcy0+aGlkZGVuLT51bGF3X2J1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy0+c3BlYy5jaGFubmVscyA9IDE7CiAgICB9IGVsc2UgewogICAgICAgIHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUgPSB0aGlzLT5zcGVjLnNhbXBsZXM7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmVxdWVuY3kgPSB0aGlzLT5zcGVjLmZyZXEgLyAxMDAwOwogICAgfQojaWZkZWYgREVCVUdfQVVESU8KICAgIGZwcmludGYoc3RkZXJyLCAiQXVkaW8gZGV2aWNlICVzIFUtTGF3IG9ubHlcbiIsCiAgICAgICAgICAgIHRoaXMtPmhpZGRlbi0+dWxhd19vbmx5ID8gImlzIiA6ICJpcyBub3QiKTsKICAgIGZwcmludGYoc3RkZXJyLCAiZm9ybWF0PTB4JXggY2hhbj0lZCBmcmVxPSVkXG4iLAogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCwgdGhpcy0+c3BlYy5jaGFubmVscywgdGhpcy0+c3BlYy5mcmVxKTsKI2VuZGlmCgogICAgLyogVXBkYXRlIHRoZSBmcmFnbWVudCBzaXplIGFzIHNpemUgaW4gYnl0ZXMgKi8KICAgIFNETF9DYWxjdWxhdGVBdWRpb1NwZWMoJnRoaXMtPnNwZWMpOwoKICAgIC8qIEFsbG9jYXRlIG1peGluZyBidWZmZXIgKi8KICAgIHRoaXMtPmhpZGRlbi0+bWl4YnVmID0gKFVpbnQ4ICopIFNETF9BbGxvY0F1ZGlvTWVtKHRoaXMtPnNwZWMuc2l6ZSk7CiAgICBpZiAodGhpcy0+aGlkZGVuLT5taXhidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLT5taXhidWYsIHRoaXMtPnNwZWMuc2lsZW5jZSwgdGhpcy0+c3BlYy5zaXplKTsKCiAgICAvKiBXZSdyZSByZWFkeSB0byByb2NrIGFuZCByb2xsLiA6LSkgKi8KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBUaGlzIGZ1bmN0aW9uIChzbmQyYXUoKSkgY29weXJpZ2h0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgIENvcHlyaWdodCAxOTg5IGJ5IFJpY2ggR29wc3RlaW4gYW5kIEhhcnJpcyBDb3Jwb3JhdGlvbiAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgICAqLwovKiAgICAgIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzICAgICAgICAqLwovKiAgICAgIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlICAgICAgICAqLwovKiAgICAgIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgICAqLwovKiAgICAgIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kICAqLwovKiAgICAgIHRoYXQgdGhlIG5hbWUgb2YgUmljaCBHb3BzdGVpbiBhbmQgSGFycmlzIENvcnBvcmF0aW9uIG5vdCBiZSAgICAqLwovKiAgICAgIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uICAgICAqLwovKiAgICAgIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAgICAqLwovKiAgICAgIFJpY2ggR29wc3RlaW4gYW5kIEhhcnJpcyBDb3Jwb3JhdGlvbiBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucyAgICAqLwovKiAgICAgIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0ICAgICAqLwovKiAgICAgIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFVpbnQ4CnNuZDJhdShpbnQgc2FtcGxlKQp7CgogICAgaW50IG1hc2s7CgogICAgaWYgKHNhbXBsZSA8IDApIHsKICAgICAgICBzYW1wbGUgPSAtc2FtcGxlOwogICAgICAgIG1hc2sgPSAweDdmOwogICAgfSBlbHNlIHsKICAgICAgICBtYXNrID0gMHhmZjsKICAgIH0KCiAgICBpZiAoc2FtcGxlIDwgMzIpIHsKICAgICAgICBzYW1wbGUgPSAweEYwIHwgKDE1IC0gc2FtcGxlIC8gMik7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDk2KSB7CiAgICAgICAgc2FtcGxlID0gMHhFMCB8ICgxNSAtIChzYW1wbGUgLSAzMikgLyA0KTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgMjI0KSB7CiAgICAgICAgc2FtcGxlID0gMHhEMCB8ICgxNSAtIChzYW1wbGUgLSA5NikgLyA4KTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgNDgwKSB7CiAgICAgICAgc2FtcGxlID0gMHhDMCB8ICgxNSAtIChzYW1wbGUgLSAyMjQpIC8gMTYpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCA5OTIpIHsKICAgICAgICBzYW1wbGUgPSAweEIwIHwgKDE1IC0gKHNhbXBsZSAtIDQ4MCkgLyAzMik7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDIwMTYpIHsKICAgICAgICBzYW1wbGUgPSAweEEwIHwgKDE1IC0gKHNhbXBsZSAtIDk5MikgLyA2NCk7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDQwNjQpIHsKICAgICAgICBzYW1wbGUgPSAweDkwIHwgKDE1IC0gKHNhbXBsZSAtIDIwMTYpIC8gMTI4KTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgODE2MCkgewogICAgICAgIHNhbXBsZSA9IDB4ODAgfCAoMTUgLSAoc2FtcGxlIC0gNDA2NCkgLyAyNTYpOwogICAgfSBlbHNlIHsKICAgICAgICBzYW1wbGUgPSAweDgwOwogICAgfQogICAgcmV0dXJuIChtYXNrICYgc2FtcGxlKTsKfQoKc3RhdGljIGludApTVU5BVURJT19Jbml0KFNETF9BdWRpb0RyaXZlckltcGwgKiBpbXBsKQp7CiAgICAvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAgICBpbXBsLT5EZXRlY3REZXZpY2VzID0gU1VOQVVESU9fRGV0ZWN0RGV2aWNlczsKICAgIGltcGwtPk9wZW5EZXZpY2UgPSBTVU5BVURJT19PcGVuRGV2aWNlOwogICAgaW1wbC0+UGxheURldmljZSA9IFNVTkFVRElPX1BsYXlEZXZpY2U7CiAgICBpbXBsLT5XYWl0RGV2aWNlID0gU1VOQVVESU9fV2FpdERldmljZTsKICAgIGltcGwtPkdldERldmljZUJ1ZiA9IFNVTkFVRElPX0dldERldmljZUJ1ZjsKICAgIGltcGwtPkNsb3NlRGV2aWNlID0gU1VOQVVESU9fQ2xvc2VEZXZpY2U7CgogICAgcmV0dXJuIDE7IC8qIHRoaXMgYXVkaW8gdGFyZ2V0IGlzIGF2YWlsYWJsZS4gKi8KfQoKQXVkaW9Cb290U3RyYXAgU1VOQVVESU9fYm9vdHN0cmFwID0gewogICAgImF1ZGlvIiwgIlVOSVggL2Rldi9hdWRpbyBpbnRlcmZhY2UiLCBTVU5BVURJT19Jbml0LCAwCn07CgojZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTyAqLwoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=