ZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9NYWtlZmlsZSBiL2xpYmhkaG9tZXJ1bi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZmRhNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL01ha2VmaWxlCkBAIC0wLDAgKzEsNTkgQEAKKworTElCU1JDUyArPSBoZGhvbWVydW5fY2hhbm5lbHMuYworTElCU1JDUyArPSBoZGhvbWVydW5fY2hhbm5lbHNjYW4uYworTElCU1JDUyArPSBoZGhvbWVydW5fY29udHJvbC5jCitMSUJTUkNTICs9IGhkaG9tZXJ1bl9kZWJ1Zy5jCitMSUJTUkNTICs9IGhkaG9tZXJ1bl9kZXZpY2UuYworTElCU1JDUyArPSBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yLmMKK0xJQlNSQ1MgKz0gaGRob21lcnVuX2Rpc2NvdmVyLmMKK0xJQlNSQ1MgKz0gaGRob21lcnVuX29zX3Bvc2l4LmMKK0xJQlNSQ1MgKz0gaGRob21lcnVuX3BrdC5jCitMSUJTUkNTICs9IGhkaG9tZXJ1bl9zb2NrX3Bvc2l4LmMKK0xJQlNSQ1MgKz0gaGRob21lcnVuX3ZpZGVvLmMKKworQ0MgICAgOj0gJChDUk9TU19DT01QSUxFKWdjYworU1RSSVAgOj0gJChDUk9TU19DT01QSUxFKXN0cmlwCisKK0NGTEFHUyArPSAtV2FsbCAtTzIgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1XcG9pbnRlci1hcml0aAorTERGTEFHUyArPSAtbHB0aHJlYWQKK1NIQVJFRCA9IC1zaGFyZWQgLVdsLC1zb25hbWUsbGliaGRob21lcnVuJChMSUJFWFQpCisKK2lmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCisgIEJJTkVYVCA6PSAuZXhlCisgIExJQkVYVCA6PSAuZGxsCisgIExERkxBR1MgKz0gLWxpcGhscGFwaQorZWxzZQorICBPUyA6PSAkKHNoZWxsIHVuYW1lIC1zKQorICBMSUJFWFQgOj0gLnNvCisgIGlmZXEgKCQoT1MpLExpbnV4KQorICAgIExERkxBR1MgKz0gLWxydAorICBlbmRpZgorICBpZmVxICgkKE9TKSxTdW5PUykKKyAgICBMREZMQUdTICs9IC1sc29ja2V0CisgIGVuZGlmCisgIGlmZXEgKCQoT1MpLERhcndpbikKKyAgICBDRkxBR1MgKz0gLWFyY2ggaTM4NiAtYXJjaCBwcGMKKyAgICBMSUJFWFQgOj0gLmR5bGliCisgICAgU0hBUkVEIDo9IC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgbGliaGRob21lcnVuJChMSUJFWFQpCisgIGVuZGlmCitlbmRpZgorCithbGwgOiBoZGhvbWVydW5fY29uZmlnJChCSU5FWFQpIGxpYmhkaG9tZXJ1biQoTElCRVhUKQorCitoZGhvbWVydW5fY29uZmlnJChCSU5FWFQpIDogaGRob21lcnVuX2NvbmZpZy5jICQoTElCU1JDUykKKwkkKENDKSAkKENGTEFHUykgJCsgJChMREZMQUdTKSAtbyAkQAorCSQoU1RSSVApICRACisKK2xpYmhkaG9tZXJ1biQoTElCRVhUKSA6ICQoTElCU1JDUykKKwkkKENDKSAkKENGTEFHUykgLWZQSUMgLURETExfRVhQT1JUICQoU0hBUkVEKSAkKyAkKExERkxBR1MpIC1vICRACisKK2NsZWFuIDoKKwktcm0gLWYgaGRob21lcnVuX2NvbmZpZyQoQklORVhUKQorCS1ybSAtZiBsaWJoZGhvbWVydW4kKExJQkVYVCkKKworZGlzdGNsZWFuIDogY2xlYW4KKworJToKKwlAZWNobyAiKGlnbm9yaW5nIHJlcXVlc3QgdG8gbWFrZSAkQCkiCisKKy5QSE9OWTogYWxsIGxpc3QgY2xlYW4gZGlzdGNsZWFuCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vUkVBRE1FIGIvbGliaGRob21lcnVuL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjVkODUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL1JFQURNRQpAQCAtMCwwICsxLDQxIEBACisvKgorICogUkVBRE1FCisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA5IFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworVG9wIGxldmVsIGluY2x1ZGUgZmlsZTogaGRob21lcnVuLmgKKworVG9wIGxldmVsIEFQSTogaGRob21lcnVuX2RldmljZS4gU2VlIGhkaG9tZXJ1bl9kZXZpY2UuaCBmb3IgZG9jdW1lbnRhdGlvbi4KKworVGhlIGhkaG9tZXJ1bl9kZXZpY2UgQVBJIHNob3VsZCBiZSB1c2VkIHJhdGhlciB0aGFuIHRoZSBsb3cgbGV2ZWwgY29udHJvbCBhbmQgdmlkZW8gQVBJcyByZXF1aXJlZCB3aXRoIHByZXZpb3VzIHZlcnNpb25zLgorCitBZGRpdGlvbmFsIGxpYnJhcmllcyByZXF1aXJlZDoKKy0gcHRocmVhZAorLSBpcGhscGFwaSAod2luZG93cyBvbmx5KQpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bi5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmZmQ0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGhkaG9tZXJ1bi5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAxMCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJoZGhvbWVydW5fb3MuaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fdHlwZXMuaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fcGt0LmgiCisjaW5jbHVkZSAiaGRob21lcnVuX3NvY2suaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fZGVidWcuaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fZGlzY292ZXIuaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fY29udHJvbC5oIgorI2luY2x1ZGUgImhkaG9tZXJ1bl92aWRlby5oIgorI2luY2x1ZGUgImhkaG9tZXJ1bl9jaGFubmVscy5oIgorI2luY2x1ZGUgImhkaG9tZXJ1bl9jaGFubmVsc2Nhbi5oIgorI2luY2x1ZGUgImhkaG9tZXJ1bl9kZXZpY2UuaCIKKyNpbmNsdWRlICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yLmgiCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2NoYW5uZWxzLmMgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NoYW5uZWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzc4ZWJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY2hhbm5lbHMuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIGhkaG9tZXJ1bl9jaGFubmVscy5jCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJoZGhvbWVydW4uaCIKKworc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgeworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICpuZXh0OworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICpwcmV2OworCXVpbnQzMl90IGZyZXF1ZW5jeTsKKwl1aW50MTZfdCBjaGFubmVsX251bWJlcjsKKwljaGFyIG5hbWVbMTZdOworfTsKKworc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCB7CisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmhlYWQ7CisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKnRhaWw7Cit9OworCitzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdCB7CisJdWludDE2X3QgY2hhbm5lbF9yYW5nZV9zdGFydDsKKwl1aW50MTZfdCBjaGFubmVsX3JhbmdlX2VuZDsKKwl1aW50MzJfdCBmcmVxdWVuY3k7CisJdWludDMyX3Qgc3BhY2luZzsKK307CisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yZWNvcmRfdCB7CisJY29uc3QgY2hhciAqY2hhbm5lbG1hcDsKKwljb25zdCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdCAqcmFuZ2VfbGlzdDsKKwljb25zdCBjaGFyICpjaGFubmVsbWFwX3NjYW5fZ3JvdXA7CisJY29uc3QgY2hhciAqY291bnRyeWNvZGVzOworfTsKKworLyogQVUgYW50ZW5uYSBjaGFubmVscy4gQ2hhbm5lbHMgezYsIDcsIDgsIDksIDlBfSBhcmUgbnVtYmVyZWQgezUsIDYsIDcsIDgsIDl9IGJ5IHRoZSBIREhvbWVSdW4uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfYXVfYmNhc3RbXSA9IHsKKwl7ICA1LCAgMTIsIDE3NzUwMDAwMCwgNzAwMDAwMH0sCisJeyAyMSwgIDY5LCA0ODA1MDAwMDAsIDcwMDAwMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworLyogRVUgYW50ZW5uYSBjaGFubmVscy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV9ldV9iY2FzdFtdID0geworCXsgIDUsICAxMiwgMTc3NTAwMDAwLCA3MDAwMDAwfSwKKwl7IDIxLCAgNjksIDQ3NDAwMDAwMCwgODAwMDAwMH0sCisJeyAgMCwgICAwLCAgICAgICAgIDAsICAgICAgIDB9Cit9OworCisvKiBFVSBjYWJsZSBjaGFubmVscy4gTm8gY29tbW9uIHN0YW5kYXJkIC0gdXNlIGZyZXF1ZW5jeSBpbiBNSHogZm9yIGNoYW5uZWwgbnVtYmVyLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV90IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX2V1X2NhYmxlW10gPSB7CisJeyA1MCwgOTk4LCAgNTAwMDAwMDAsIDEwMDAwMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworLyogS1IgY2FibGUgY2hhbm5lbHMuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2Vfa3JfY2FibGVbXSA9IHsKKwl7ICAyLCAgIDQsICA1NzAwMDAwMCwgNjAwMDAwMH0sCisJeyAgNSwgICA2LCAgNzkwMDAwMDAsIDYwMDAwMDB9LAorCXsgIDcsICAxMywgMTc3MDAwMDAwLCA2MDAwMDAwfSwKKwl7IDE0LCAgMjIsIDEyMzAwMDAwMCwgNjAwMDAwMH0sCisJeyAyMywgMTUzLCAyMTkwMDAwMDAsIDYwMDAwMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworLyogVVMgYW50ZW5uYSBjaGFubmVscy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV91c19iY2FzdFtdID0geworCXsgIDIsICAgNCwgIDU3MDAwMDAwLCA2MDAwMDAwfSwKKwl7ICA1LCAgIDYsICA3OTAwMDAwMCwgNjAwMDAwMH0sCisJeyAgNywgIDEzLCAxNzcwMDAwMDAsIDYwMDAwMDB9LAorCXsgMTQsICA2OSwgNDczMDAwMDAwLCA2MDAwMDAwfSwKKwl7ICAwLCAgIDAsICAgICAgICAgMCwgICAgICAgMH0KK307CisKKy8qIFVTIGNhYmxlIGNoYW5uZWxzLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV90IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3VzX2NhYmxlW10gPSB7CisJeyAgMiwgICA0LCAgNTcwMDAwMDAsIDYwMDAwMDB9LAorCXsgIDUsICAgNiwgIDc5MDAwMDAwLCA2MDAwMDAwfSwKKwl7ICA3LCAgMTMsIDE3NzAwMDAwMCwgNjAwMDAwMH0sCisJeyAxNCwgIDIyLCAxMjMwMDAwMDAsIDYwMDAwMDB9LAorCXsgMjMsICA5NCwgMjE5MDAwMDAwLCA2MDAwMDAwfSwKKwl7IDk1LCAgOTksICA5MzAwMDAwMCwgNjAwMDAwMH0sCisJezEwMCwgMTU4LCA2NTEwMDAwMDAsIDYwMDAwMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworLyogVVMgY2FibGUgY2hhbm5lbHMgKEhSQykuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdXNfaHJjW10gPSB7CisJeyAgMiwgICA0LCAgNTU3NTI3MDAsIDYwMDAzMDB9LAorCXsgIDUsICAgNiwgIDc5NzUzOTAwLCA2MDAwMzAwfSwKKwl7ICA3LCAgMTMsIDE3NTc1ODcwMCwgNjAwMDMwMH0sCisJeyAxNCwgIDIyLCAxMjE3NTYwMDAsIDYwMDAzMDB9LAorCXsgMjMsICA5NCwgMjE3NzYwODAwLCA2MDAwMzAwfSwKKwl7IDk1LCAgOTksICA5MTc1NDUwMCwgNjAwMDMwMH0sCisJezEwMCwgMTU4LCA2NDk3ODI0MDAsIDYwMDAzMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworLyogVVMgY2FibGUgY2hhbm5lbHMgKElSQykuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdXNfaXJjW10gPSB7CisJeyAgMiwgICA0LCAgNTcwMTI1MDAsIDYwMDAwMDB9LAorCXsgIDUsICAgNiwgIDgxMDEyNTAwLCA2MDAwMDAwfSwKKwl7ICA3LCAgMTMsIDE3NzAxMjUwMCwgNjAwMDAwMH0sCisJeyAxNCwgIDIyLCAxMjMwMTI1MDAsIDYwMDAwMDB9LAorCXsgMjMsICA0MSwgMjE5MDEyNTAwLCA2MDAwMDAwfSwKKwl7IDQyLCAgNDIsIDMzMzAyNTAwMCwgNjAwMDAwMH0sCisJeyA0MywgIDk0LCAzMzkwMTI1MDAsIDYwMDAwMDB9LAorCXsgOTUsICA5NywgIDkzMDEyNTAwLCA2MDAwMDAwfSwKKwl7IDk4LCAgOTksIDExMTAyNTAwMCwgNjAwMDAwMH0sCisJezEwMCwgMTU4LCA2NTEwMTI1MDAsIDYwMDAwMDB9LAorCXsgIDAsICAgMCwgICAgICAgICAwLCAgICAgICAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yZWNvcmRfdCBoZGhvbWVydW5fY2hhbm5lbG1hcF90YWJsZVtdID0geworCXsiYXUtYmNhc3QiLCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV9hdV9iY2FzdCwgImF1LWJjYXN0IiwgICAgICAgICAgICAgICAiQVUifSwKKwl7ImF1LWNhYmxlIiwgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfZXVfY2FibGUsICJhdS1jYWJsZSIsICAgICAgICAgICAgICAgIkFVIn0sCisJeyJldS1iY2FzdCIsIGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX2V1X2JjYXN0LCAiZXUtYmNhc3QiLCAgICAgICAgICAgICAgICJFVSBQQSJ9LAorCXsiZXUtY2FibGUiLCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV9ldV9jYWJsZSwgImV1LWNhYmxlIiwgICAgICAgICAgICAgICAiRVUifSwKKwl7InR3LWJjYXN0IiwgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdXNfYmNhc3QsICJ0dy1iY2FzdCIsICAgICAgICAgICAgICAgIlRXIn0sCisJeyJ0dy1jYWJsZSIsIGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3VzX2NhYmxlLCAidHctY2FibGUiLCAgICAgICAgICAgICAgICJUVyJ9LAorCisJeyJrci1iY2FzdCIsIGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3VzX2JjYXN0LCAia3ItYmNhc3QiLCAgICAgICAgICAgICAgICJLUiJ9LAorCXsia3ItY2FibGUiLCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV9rcl9jYWJsZSwgImtyLWNhYmxlIiwgICAgICAgICAgICAgICAiS1IifSwKKwl7InVzLWJjYXN0IiwgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdXNfYmNhc3QsICJ1cy1iY2FzdCIsICAgICAgICAgICAgICAgIkNBIFVTIn0sCisJeyJ1cy1jYWJsZSIsIGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3VzX2NhYmxlLCAidXMtY2FibGUgdXMtaHJjIHVzLWlyYyIsICJDQSBQQSBVUyJ9LAorCXsidXMtaHJjIiwgICBoZGhvbWVydW5fY2hhbm5lbG1hcF9yYW5nZV91c19ocmMgICwgInVzLWNhYmxlIHVzLWhyYyB1cy1pcmMiLCAiQ0EgUEEgVVMifSwKKwl7InVzLWlyYyIsICAgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdXNfaXJjLCAgICJ1cy1jYWJsZSB1cy1ocmMgdXMtaXJjIiwgIkNBIFBBIFVTIn0sCisKKwl7TlVMTCwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKK2NvbnN0IGNoYXIgKmhkaG9tZXJ1bl9jaGFubmVsbWFwX2dldF9jaGFubmVsbWFwX2Zyb21fY291bnRyeV9zb3VyY2UoY29uc3QgY2hhciAqY291bnRyeWNvZGUsIGNvbnN0IGNoYXIgKnNvdXJjZSkKK3sKKwlib29sX3QgY291bnRyeV9mb3VuZCA9IEZBTFNFOworCisJY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JlY29yZF90ICpyZWNvcmQgPSBoZGhvbWVydW5fY2hhbm5lbG1hcF90YWJsZTsKKwl3aGlsZSAocmVjb3JkLT5jaGFubmVsbWFwKSB7CisJCWlmICghc3Ryc3RyKHJlY29yZC0+Y291bnRyeWNvZGVzLCBjb3VudHJ5Y29kZSkpIHsKKwkJCXJlY29yZCsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3Ryc3RyKHJlY29yZC0+Y2hhbm5lbG1hcCwgc291cmNlKSkgeworCQkJcmV0dXJuIHJlY29yZC0+Y2hhbm5lbG1hcDsKKwkJfQorCisJCWNvdW50cnlfZm91bmQgPSBUUlVFOworCQlyZWNvcmQrKzsKKwl9CisKKwlpZiAoIWNvdW50cnlfZm91bmQpIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9jaGFubmVsbWFwX2dldF9jaGFubmVsbWFwX2Zyb21fY291bnRyeV9zb3VyY2UoIkVVIiwgc291cmNlKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqaGRob21lcnVuX2NoYW5uZWxtYXBfZ2V0X2NoYW5uZWxtYXBfc2Nhbl9ncm91cChjb25zdCBjaGFyICpjaGFubmVsbWFwKQoreworCWNvbnN0IHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbG1hcF9yZWNvcmRfdCAqcmVjb3JkID0gaGRob21lcnVuX2NoYW5uZWxtYXBfdGFibGU7CisJd2hpbGUgKHJlY29yZC0+Y2hhbm5lbG1hcCkgeworCQlpZiAoc3Ryc3RyKGNoYW5uZWxtYXAsIHJlY29yZC0+Y2hhbm5lbG1hcCkpIHsKKwkJCXJldHVybiByZWNvcmQtPmNoYW5uZWxtYXBfc2Nhbl9ncm91cDsKKwkJfQorCQlyZWNvcmQrKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordWludDE2X3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfY2hhbm5lbF9udW1iZXIoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KQoreworCXJldHVybiBlbnRyeS0+Y2hhbm5lbF9udW1iZXI7Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X2ZyZXF1ZW5jeShzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqZW50cnkpCit7CisJcmV0dXJuIGVudHJ5LT5mcmVxdWVuY3k7Cit9CisKK2NvbnN0IGNoYXIgKmhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X25hbWUoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KQoreworCXJldHVybiBlbnRyeS0+bmFtZTsKK30KKworc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfZmlyc3Qoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0KQoreworCXJldHVybiBjaGFubmVsX2xpc3QtPmhlYWQ7Cit9CisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICpoZGhvbWVydW5fY2hhbm5lbF9saXN0X2xhc3Qoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0KQoreworCXJldHVybiBjaGFubmVsX2xpc3QtPnRhaWw7Cit9CisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICpoZGhvbWVydW5fY2hhbm5lbF9saXN0X25leHQoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0LCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqZW50cnkpCit7CisJcmV0dXJuIGVudHJ5LT5uZXh0OworfQorCitzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqaGRob21lcnVuX2NoYW5uZWxfbGlzdF9wcmV2KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KQoreworCXJldHVybiBlbnRyeS0+cHJldjsKK30KKwordWludDMyX3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90b3RhbF9jb3VudChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QpCit7CisJdWludDMyX3QgY291bnQgPSAwOworCisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9maXJzdChjaGFubmVsX2xpc3QpOworCXdoaWxlIChlbnRyeSkgeworCQljb3VudCsrOworCQllbnRyeSA9IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfbmV4dChjaGFubmVsX2xpc3QsIGVudHJ5KTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfZnJlcXVlbmN5X2NvdW50KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCkKK3sKKwl1aW50MzJfdCBjb3VudCA9IDA7CisJdWludDMyX3QgbGFzdF9mcmVxdWVuY3kgPSAwOworCisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9maXJzdChjaGFubmVsX2xpc3QpOworCXdoaWxlIChlbnRyeSkgeworCQlpZiAoZW50cnktPmZyZXF1ZW5jeSAhPSBsYXN0X2ZyZXF1ZW5jeSkgeworCQkJbGFzdF9mcmVxdWVuY3kgPSBlbnRyeS0+ZnJlcXVlbmN5OworCQkJY291bnQrKzsKKwkJfQorCisJCWVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9uZXh0KGNoYW5uZWxfbGlzdCwgZW50cnkpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKwordWludDMyX3QgaGRob21lcnVuX2NoYW5uZWxfZnJlcXVlbmN5X3JvdW5kKHVpbnQzMl90IGZyZXF1ZW5jeSwgdWludDMyX3QgcmVzb2x1dGlvbikKK3sKKwlmcmVxdWVuY3kgKz0gcmVzb2x1dGlvbiAvIDI7CisJcmV0dXJuIChmcmVxdWVuY3kgLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb247Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2ZyZXF1ZW5jeV9yb3VuZF9ub3JtYWwodWludDMyX3QgZnJlcXVlbmN5KQoreworCXJldHVybiBoZGhvbWVydW5fY2hhbm5lbF9mcmVxdWVuY3lfcm91bmQoZnJlcXVlbmN5LCAxMjUwMDApOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fY2hhbm5lbF9udW1iZXJfdG9fZnJlcXVlbmN5KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCwgdWludDE2X3QgY2hhbm5lbF9udW1iZXIpCit7CisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9maXJzdChjaGFubmVsX2xpc3QpOworCXdoaWxlIChlbnRyeSkgeworCQlpZiAoZW50cnktPmNoYW5uZWxfbnVtYmVyID09IGNoYW5uZWxfbnVtYmVyKSB7CisJCQlyZXR1cm4gZW50cnktPmZyZXF1ZW5jeTsKKwkJfQorCisJCWVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9uZXh0KGNoYW5uZWxfbGlzdCwgZW50cnkpOworCX0KKworCXJldHVybiAwOworfQorCit1aW50MTZfdCBoZGhvbWVydW5fY2hhbm5lbF9mcmVxdWVuY3lfdG9fbnVtYmVyKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCwgdWludDMyX3QgZnJlcXVlbmN5KQoreworCWZyZXF1ZW5jeSA9IGhkaG9tZXJ1bl9jaGFubmVsX2ZyZXF1ZW5jeV9yb3VuZF9ub3JtYWwoZnJlcXVlbmN5KTsKKworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSA9IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfZmlyc3QoY2hhbm5lbF9saXN0KTsKKwl3aGlsZSAoZW50cnkpIHsKKwkJaWYgKGVudHJ5LT5mcmVxdWVuY3kgPT0gZnJlcXVlbmN5KSB7CisJCQlyZXR1cm4gZW50cnktPmNoYW5uZWxfbnVtYmVyOworCQl9CisJCWlmIChlbnRyeS0+ZnJlcXVlbmN5ID4gZnJlcXVlbmN5KSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9uZXh0KGNoYW5uZWxfbGlzdCwgZW50cnkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X2J1aWxkX2luc2VydChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QsIHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSkKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqcHJldiA9IE5VTEw7CisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKm5leHQgPSBjaGFubmVsX2xpc3QtPmhlYWQ7CisKKwl3aGlsZSAobmV4dCkgeworCQlpZiAobmV4dC0+ZnJlcXVlbmN5ID4gZW50cnktPmZyZXF1ZW5jeSkgeworCQkJYnJlYWs7CisJCX0KKworCQlwcmV2ID0gbmV4dDsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCisJZW50cnktPnByZXYgPSBwcmV2OworCWVudHJ5LT5uZXh0ID0gbmV4dDsKKworCWlmIChwcmV2KSB7CisJCXByZXYtPm5leHQgPSBlbnRyeTsKKwl9IGVsc2UgeworCQljaGFubmVsX2xpc3QtPmhlYWQgPSBlbnRyeTsKKwl9CisKKwlpZiAobmV4dCkgeworCQluZXh0LT5wcmV2ID0gZW50cnk7CisJfSBlbHNlIHsKKwkJY2hhbm5lbF9saXN0LT50YWlsID0gZW50cnk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X2J1aWxkX3JhbmdlKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCwgY29uc3QgY2hhciAqY2hhbm5lbG1hcCwgY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JhbmdlX3QgKnJhbmdlKQoreworCXVpbnQxNl90IGNoYW5uZWxfbnVtYmVyOworCWZvciAoY2hhbm5lbF9udW1iZXIgPSByYW5nZS0+Y2hhbm5lbF9yYW5nZV9zdGFydDsgY2hhbm5lbF9udW1iZXIgPD0gcmFuZ2UtPmNoYW5uZWxfcmFuZ2VfZW5kOyBjaGFubmVsX251bWJlcisrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSA9IChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QpKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZW50cnktPmNoYW5uZWxfbnVtYmVyID0gY2hhbm5lbF9udW1iZXI7CisJCWVudHJ5LT5mcmVxdWVuY3kgPSByYW5nZS0+ZnJlcXVlbmN5ICsgKCh1aW50MzJfdCkoY2hhbm5lbF9udW1iZXIgLSByYW5nZS0+Y2hhbm5lbF9yYW5nZV9zdGFydCkgKiByYW5nZS0+c3BhY2luZyk7CisJCWVudHJ5LT5mcmVxdWVuY3kgPSBoZGhvbWVydW5fY2hhbm5lbF9mcmVxdWVuY3lfcm91bmRfbm9ybWFsKGVudHJ5LT5mcmVxdWVuY3kpOworCQlzcHJpbnRmKGVudHJ5LT5uYW1lLCAiJXM6JXUiLCBjaGFubmVsbWFwLCBlbnRyeS0+Y2hhbm5lbF9udW1iZXIpOworCisJCWhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfYnVpbGRfaW5zZXJ0KGNoYW5uZWxfbGlzdCwgZW50cnkpOworCX0KK30KKworc3RhdGljIHZvaWQgaGRob21lcnVuX2NoYW5uZWxfbGlzdF9idWlsZF9yYW5nZXMoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0LCBjb25zdCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmVjb3JkX3QgKnJlY29yZCkKK3sKKwljb25zdCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxtYXBfcmFuZ2VfdCAqcmFuZ2UgPSByZWNvcmQtPnJhbmdlX2xpc3Q7CisJd2hpbGUgKHJhbmdlLT5mcmVxdWVuY3kpIHsKKwkJaGRob21lcnVuX2NoYW5uZWxfbGlzdF9idWlsZF9yYW5nZShjaGFubmVsX2xpc3QsIHJlY29yZC0+Y2hhbm5lbG1hcCwgcmFuZ2UpOworCQlyYW5nZSsrOworCX0KK30KKwordm9pZCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0KQoreworCXdoaWxlIChjaGFubmVsX2xpc3QtPmhlYWQpIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5ID0gY2hhbm5lbF9saXN0LT5oZWFkOworCQljaGFubmVsX2xpc3QtPmhlYWQgPSBlbnRyeS0+bmV4dDsKKwkJZnJlZShlbnRyeSk7CisJfQorCisJZnJlZShjaGFubmVsX2xpc3QpOworfQorCitzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpoZGhvbWVydW5fY2hhbm5lbF9saXN0X2NyZWF0ZShjb25zdCBjaGFyICpjaGFubmVsbWFwKQoreworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCA9IChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90KSk7CisJaWYgKCFjaGFubmVsX2xpc3QpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29uc3Qgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsbWFwX3JlY29yZF90ICpyZWNvcmQgPSBoZGhvbWVydW5fY2hhbm5lbG1hcF90YWJsZTsKKwl3aGlsZSAocmVjb3JkLT5jaGFubmVsbWFwKSB7CisJCWlmICghc3Ryc3RyKGNoYW5uZWxtYXAsIHJlY29yZC0+Y2hhbm5lbG1hcCkpIHsKKwkJCXJlY29yZCsrOworCQkJY29udGludWU7CisJCX0KKworCQloZGhvbWVydW5fY2hhbm5lbF9saXN0X2J1aWxkX3JhbmdlcyhjaGFubmVsX2xpc3QsIHJlY29yZCk7CisJCXJlY29yZCsrOworCX0KKworCWlmICghY2hhbm5lbF9saXN0LT5oZWFkKSB7CisJCWZyZWUoY2hhbm5lbF9saXN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGNoYW5uZWxfbGlzdDsKK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY2hhbm5lbHMuaCBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY2hhbm5lbHMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzcyY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jaGFubmVscy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBoZGhvbWVydW5fY2hhbm5lbHMuaAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMDggU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90Oworc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdDsKKworZXh0ZXJuIExJQlRZUEUgY29uc3QgY2hhciAqaGRob21lcnVuX2NoYW5uZWxtYXBfZ2V0X2NoYW5uZWxtYXBfZnJvbV9jb3VudHJ5X3NvdXJjZShjb25zdCBjaGFyICpjb3VudHJ5Y29kZSwgY29uc3QgY2hhciAqc291cmNlKTsKK2V4dGVybiBMSUJUWVBFIGNvbnN0IGNoYXIgKmhkaG9tZXJ1bl9jaGFubmVsbWFwX2dldF9jaGFubmVsbWFwX3NjYW5fZ3JvdXAoY29uc3QgY2hhciAqY2hhbm5lbG1hcCk7CisKK2V4dGVybiBMSUJUWVBFIHVpbnQxNl90IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSk7CitleHRlcm4gTElCVFlQRSB1aW50MzJfdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV9mcmVxdWVuY3koc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KTsKK2V4dGVybiBMSUJUWVBFIGNvbnN0IGNoYXIgKmhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X25hbWUoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KTsKKworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqaGRob21lcnVuX2NoYW5uZWxfbGlzdF9jcmVhdGUoY29uc3QgY2hhciAqY2hhbm5lbG1hcCk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfZGVzdHJveShzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QpOworCitleHRlcm4gTElCVFlQRSBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqaGRob21lcnVuX2NoYW5uZWxfbGlzdF9maXJzdChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QpOworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfbGFzdChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QpOworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfbmV4dChzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QsIHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSk7CitleHRlcm4gTElCVFlQRSBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfdCAqaGRob21lcnVuX2NoYW5uZWxfbGlzdF9wcmV2KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5KTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdG90YWxfY291bnQoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0KTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfZnJlcXVlbmN5X2NvdW50KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3QgKmNoYW5uZWxfbGlzdCk7CisKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9jaGFubmVsX2ZyZXF1ZW5jeV9yb3VuZCh1aW50MzJfdCBmcmVxdWVuY3ksIHVpbnQzMl90IHJlc29sdXRpb24pOworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2NoYW5uZWxfZnJlcXVlbmN5X3JvdW5kX25vcm1hbCh1aW50MzJfdCBmcmVxdWVuY3kpOworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2NoYW5uZWxfbnVtYmVyX3RvX2ZyZXF1ZW5jeShzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3QsIHVpbnQxNl90IGNoYW5uZWxfbnVtYmVyKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQxNl90IGhkaG9tZXJ1bl9jaGFubmVsX2ZyZXF1ZW5jeV90b19udW1iZXIoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfdCAqY2hhbm5lbF9saXN0LCB1aW50MzJfdCBmcmVxdWVuY3kpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jaGFubmVsc2Nhbi5jIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jaGFubmVsc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjMWY4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NoYW5uZWxzY2FuLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBoZGhvbWVydW5fY2hhbm5lbHNjYW4uYworICoKKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaGRob21lcnVuLmgiCisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCB7CisJc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQ7CisJdWludDMyX3Qgc2Nhbm5lZF9jaGFubmVsczsKKwlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxfbGlzdF90ICpjaGFubmVsX2xpc3Q7CQorCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICpuZXh0X2NoYW5uZWw7Cit9OworCitzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3QgKmNoYW5uZWxzY2FuX2NyZWF0ZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqY2hhbm5lbG1hcCkKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3QgKnNjYW4gPSAoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3QpKTsKKwlpZiAoIXNjYW4pIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2Nhbi0+aGQgPSBoZDsKKworCXNjYW4tPmNoYW5uZWxfbGlzdCA9IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfY3JlYXRlKGNoYW5uZWxtYXApOworCWlmICghc2Nhbi0+Y2hhbm5lbF9saXN0KSB7CisJCWZyZWUoc2Nhbik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNjYW4tPm5leHRfY2hhbm5lbCA9IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfbGFzdChzY2FuLT5jaGFubmVsX2xpc3QpOworCXJldHVybiBzY2FuOworfQorCit2b2lkIGNoYW5uZWxzY2FuX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpzY2FuKQoreworCWZyZWUoc2Nhbik7Cit9CisKK3N0YXRpYyBpbnQgY2hhbm5lbHNjYW5fZmluZF9sb2NrKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCAqc2NhbiwgdWludDMyX3QgZnJlcXVlbmN5LCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Jlc3VsdF90ICpyZXN1bHQpCit7CisJLyogU2V0IGNoYW5uZWwuICovCisJY2hhciBjaGFubmVsX3N0cls2NF07CisJc3ByaW50ZihjaGFubmVsX3N0ciwgImF1dG86JWxkIiwgKHVuc2lnbmVkIGxvbmcpZnJlcXVlbmN5KTsKKworCWludCByZXQgPSBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9jaGFubmVsKHNjYW4tPmhkLCBjaGFubmVsX3N0cik7CisJaWYgKHJldCA8PSAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogV2FpdCBmb3IgbG9jay4gKi8KKwlyZXQgPSBoZGhvbWVydW5fZGV2aWNlX3dhaXRfZm9yX2xvY2soc2Nhbi0+aGQsICZyZXN1bHQtPnN0YXR1cyk7CisJaWYgKHJldCA8PSAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCWlmICghcmVzdWx0LT5zdGF0dXMubG9ja19zdXBwb3J0ZWQpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogV2FpdCBmb3Igc3ltYm9sIHF1YWxpdHkgPSAxMDAlLiAqLworCXVpbnQ2NF90IHRpbWVvdXQgPSBnZXRjdXJyZW50dGltZSgpICsgNTAwMDsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9zdGF0dXMoc2Nhbi0+aGQsIE5VTEwsICZyZXN1bHQtPnN0YXR1cyk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChyZXN1bHQtPnN0YXR1cy5zeW1ib2xfZXJyb3JfcXVhbGl0eSA9PSAxMDApIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGdldGN1cnJlbnR0aW1lKCkgPj0gdGltZW91dCkgeworCQkJcmV0dXJuIDE7CisJCX0KKworCQltc2xlZXBfYXBwcm94KDI1MCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGFubmVsc2Nhbl9leHRyYWN0X25hbWUoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9wcm9ncmFtX3QgKnByb2dyYW0sIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJLyogRmluZCBzdGFydCBvZiBuYW1lLiAqLworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gc3RyY2hyKGxpbmUsICcgJyk7CisJaWYgKCFzdGFydCkgeworCQlyZXR1cm47CisJfQorCXN0YXJ0Kys7CisKKwlzdGFydCA9IHN0cmNocihzdGFydCwgJyAnKTsKKwlpZiAoIXN0YXJ0KSB7CisJCXJldHVybjsKKwl9CisJc3RhcnQrKzsKKworCS8qIEZpbmQgZW5kIG9mIG5hbWUuICovCisJY29uc3QgY2hhciAqZW5kID0gc3Ryc3RyKHN0YXJ0LCAiICgiKTsKKwlpZiAoIWVuZCkgeworCQllbmQgPSBzdHJjaHIobGluZSwgMCk7CisJfQorCisJaWYgKGVuZCA8PSBzdGFydCkgeworCQlyZXR1cm47CisJfQorCisJLyogRXh0cmFjdCBuYW1lLiAqLworCXNpemVfdCBsZW5ndGggPSAoc2l6ZV90KShlbmQgLSBzdGFydCk7CisJaWYgKGxlbmd0aCA+IHNpemVvZihwcm9ncmFtLT5uYW1lKSAtIDEpIHsKKwkJbGVuZ3RoID0gc2l6ZW9mKHByb2dyYW0tPm5hbWUpIC0gMTsKKwl9CisKKwlzdHJuY3B5KHByb2dyYW0tPm5hbWUsIHN0YXJ0LCBsZW5ndGgpOworCXByb2dyYW0tPm5hbWVbbGVuZ3RoXSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhbm5lbHNjYW5fZGV0ZWN0X3Byb2dyYW1zKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCAqc2Nhbiwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCAqcmVzdWx0LCBib29sX3QgKnBjaGFuZ2VkLCBib29sX3QgKnBpbmNvbXBsZXRlKQoreworCSpwY2hhbmdlZCA9IEZBTFNFOworCSpwaW5jb21wbGV0ZSA9IEZBTFNFOworCisJY2hhciAqc3RyZWFtaW5mbzsKKwlpbnQgcmV0ID0gaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RyZWFtaW5mbyhzY2FuLT5oZCwgJnN0cmVhbWluZm8pOworCWlmIChyZXQgPD0gMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYXIgKm5leHRfbGluZSA9IHN0cmVhbWluZm87CisJaW50IHByb2dyYW1fY291bnQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqbGluZSA9IG5leHRfbGluZTsKKworCQluZXh0X2xpbmUgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJCWlmICghbmV4dF9saW5lKSB7CisJCQlicmVhazsKKwkJfQorCQkqbmV4dF9saW5lKysgPSAwOworCisJCXVuc2lnbmVkIGludCB0cmFuc3BvcnRfc3RyZWFtX2lkOworCQlpZiAoc3NjYW5mKGxpbmUsICJ0c2lkPTB4JXgiLCAmdHJhbnNwb3J0X3N0cmVhbV9pZCkgPT0gMSkgeworCQkJcmVzdWx0LT50cmFuc3BvcnRfc3RyZWFtX2lkID0gdHJhbnNwb3J0X3N0cmVhbV9pZDsKKwkJCXJlc3VsdC0+dHJhbnNwb3J0X3N0cmVhbV9pZF9kZXRlY3RlZCA9IFRSVUU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwcm9ncmFtX2NvdW50ID49IEhESE9NRVJVTl9DSEFOTkVMU0NBTl9NQVhfUFJPR1JBTV9DT1VOVCkgeworCQkJY29udGludWU7CisJCX0KKworCQlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Byb2dyYW1fdCBwcm9ncmFtOworCQltZW1zZXQoJnByb2dyYW0sIDAsIHNpemVvZihwcm9ncmFtKSk7CisKKwkJc3RybmNweShwcm9ncmFtLnByb2dyYW1fc3RyLCBsaW5lLCBzaXplb2YocHJvZ3JhbS5wcm9ncmFtX3N0cikpOworCQlwcm9ncmFtLnByb2dyYW1fc3RyW3NpemVvZihwcm9ncmFtLnByb2dyYW1fc3RyKSAtIDFdID0gMDsKKworCQl1bnNpZ25lZCBpbnQgcHJvZ3JhbV9udW1iZXI7CisJCXVuc2lnbmVkIGludCB2aXJ0dWFsX21ham9yLCB2aXJ0dWFsX21pbm9yOworCQlpZiAoc3NjYW5mKGxpbmUsICIldTogJXUuJXUiLCAmcHJvZ3JhbV9udW1iZXIsICZ2aXJ0dWFsX21ham9yLCAmdmlydHVhbF9taW5vcikgIT0gMykgeworCQkJaWYgKHNzY2FuZihsaW5lLCAiJXU6ICV1IiwgJnByb2dyYW1fbnVtYmVyLCAmdmlydHVhbF9tYWpvcikgIT0gMikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdmlydHVhbF9taW5vciA9IDA7CisJCX0KKworCQlwcm9ncmFtLnByb2dyYW1fbnVtYmVyID0gcHJvZ3JhbV9udW1iZXI7CisJCXByb2dyYW0udmlydHVhbF9tYWpvciA9IHZpcnR1YWxfbWFqb3I7CisJCXByb2dyYW0udmlydHVhbF9taW5vciA9IHZpcnR1YWxfbWlub3I7CisKKwkJY2hhbm5lbHNjYW5fZXh0cmFjdF9uYW1lKCZwcm9ncmFtLCBsaW5lKTsKKworCQlpZiAoc3Ryc3RyKGxpbmUsICIoY29udHJvbCkiKSkgeworCQkJcHJvZ3JhbS50eXBlID0gSERIT01FUlVOX0NIQU5ORUxTQ0FOX1BST0dSQU1fQ09OVFJPTDsKKwkJfSBlbHNlIGlmIChzdHJzdHIobGluZSwgIihlbmNyeXB0ZWQpIikpIHsKKwkJCXByb2dyYW0udHlwZSA9IEhESE9NRVJVTl9DSEFOTkVMU0NBTl9QUk9HUkFNX0VOQ1JZUFRFRDsKKwkJfSBlbHNlIGlmIChzdHJzdHIobGluZSwgIihubyBkYXRhKSIpKSB7CisJCQlwcm9ncmFtLnR5cGUgPSBIREhPTUVSVU5fQ0hBTk5FTFNDQU5fUFJPR1JBTV9OT0RBVEE7CisJCQkqcGluY29tcGxldGUgPSBUUlVFOworCQl9IGVsc2UgeworCQkJcHJvZ3JhbS50eXBlID0gSERIT01FUlVOX0NIQU5ORUxTQ0FOX1BST0dSQU1fTk9STUFMOworCQkJaWYgKChwcm9ncmFtLnZpcnR1YWxfbWFqb3IgPT0gMCkgfHwgKHByb2dyYW0ubmFtZVswXSA9PSAwKSkgeworCQkJCSpwaW5jb21wbGV0ZSA9IFRSVUU7CisJCQl9CisJCX0KKworCQlpZiAobWVtY21wKCZyZXN1bHQtPnByb2dyYW1zW3Byb2dyYW1fY291bnRdLCAmcHJvZ3JhbSwgc2l6ZW9mKHByb2dyYW0pKSAhPSAwKSB7CisJCQltZW1jcHkoJnJlc3VsdC0+cHJvZ3JhbXNbcHJvZ3JhbV9jb3VudF0sICZwcm9ncmFtLCBzaXplb2YocHJvZ3JhbSkpOworCQkJKnBjaGFuZ2VkID0gVFJVRTsKKwkJfQorCisJCXByb2dyYW1fY291bnQrKzsKKwl9CisKKwlpZiAocHJvZ3JhbV9jb3VudCA9PSAwKSB7CisJCSpwaW5jb21wbGV0ZSA9IFRSVUU7CisJfQorCWlmIChyZXN1bHQtPnByb2dyYW1fY291bnQgIT0gcHJvZ3JhbV9jb3VudCkgeworCQlyZXN1bHQtPnByb2dyYW1fY291bnQgPSBwcm9ncmFtX2NvdW50OworCQkqcGNoYW5nZWQgPSBUUlVFOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgY2hhbm5lbHNjYW5fYWR2YW5jZShzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3QgKnNjYW4sIHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fcmVzdWx0X3QgKnJlc3VsdCkKK3sKKwltZW1zZXQocmVzdWx0LCAwLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCkpOworCisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X3QgKmVudHJ5ID0gc2Nhbi0+bmV4dF9jaGFubmVsOworCWlmICghZW50cnkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29tYmluZSBjaGFubmVscyB3aXRoIHNhbWUgZnJlcXVlbmN5LiAqLworCXJlc3VsdC0+ZnJlcXVlbmN5ID0gaGRob21lcnVuX2NoYW5uZWxfZW50cnlfZnJlcXVlbmN5KGVudHJ5KTsKKwlzdHJuY3B5KHJlc3VsdC0+Y2hhbm5lbF9zdHIsIGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X25hbWUoZW50cnkpLCBzaXplb2YocmVzdWx0LT5jaGFubmVsX3N0cikgLSAxKTsKKwlyZXN1bHQtPmNoYW5uZWxfc3RyW3NpemVvZihyZXN1bHQtPmNoYW5uZWxfc3RyKSAtIDFdID0gMDsKKworCXdoaWxlICgxKSB7CisJCWVudHJ5ID0gaGRob21lcnVuX2NoYW5uZWxfbGlzdF9wcmV2KHNjYW4tPmNoYW5uZWxfbGlzdCwgZW50cnkpOworCQlpZiAoIWVudHJ5KSB7CisJCQlzY2FuLT5uZXh0X2NoYW5uZWwgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaGRob21lcnVuX2NoYW5uZWxfZW50cnlfZnJlcXVlbmN5KGVudHJ5KSAhPSByZXN1bHQtPmZyZXF1ZW5jeSkgeworCQkJc2Nhbi0+bmV4dF9jaGFubmVsID0gZW50cnk7CisJCQlicmVhazsKKwkJfQorCisJCWNoYXIgKnB0ciA9IHN0cmNocihyZXN1bHQtPmNoYW5uZWxfc3RyLCAwKTsKKwkJc3ByaW50ZihwdHIsICIsICVzIiwgaGRob21lcnVuX2NoYW5uZWxfZW50cnlfbmFtZShlbnRyeSkpOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgY2hhbm5lbHNjYW5fZGV0ZWN0KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCAqc2Nhbiwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCAqcmVzdWx0KQoreworCXNjYW4tPnNjYW5uZWRfY2hhbm5lbHMrKzsKKworCS8qIEZpbmQgbG9jay4gKi8KKwlpbnQgcmV0ID0gY2hhbm5lbHNjYW5fZmluZF9sb2NrKHNjYW4sIHJlc3VsdC0+ZnJlcXVlbmN5LCByZXN1bHQpOworCWlmIChyZXQgPD0gMCkgeworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoIXJlc3VsdC0+c3RhdHVzLmxvY2tfc3VwcG9ydGVkKSB7CisJCXJldHVybiAxOworCX0KKworCS8qIERldGVjdCBwcm9ncmFtcy4gKi8KKwlyZXN1bHQtPnByb2dyYW1fY291bnQgPSAwOworCisJdWludDY0X3QgdGltZW91dDsKKwlpZiAoc3Ryc3RyKGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X21vZGVsX3N0cihzY2FuLT5oZCksICJhdHNjIikpIHsKKwkJdGltZW91dCA9IGdldGN1cnJlbnR0aW1lKCkgKyA0MDAwOworCX0gZWxzZSB7CisJCXRpbWVvdXQgPSBnZXRjdXJyZW50dGltZSgpICsgMTAwMDA7CisJfQorCisJdWludDY0X3QgY29tcGxldGVfdGltZSA9IGdldGN1cnJlbnR0aW1lKCkgKyAxMDAwOworCisJd2hpbGUgKDEpIHsKKwkJYm9vbF90IGNoYW5nZWQsIGluY29tcGxldGU7CisJCXJldCA9IGNoYW5uZWxzY2FuX2RldGVjdF9wcm9ncmFtcyhzY2FuLCByZXN1bHQsICZjaGFuZ2VkLCAmaW5jb21wbGV0ZSk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChjaGFuZ2VkKSB7CisJCQljb21wbGV0ZV90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIDEwMDA7CisJCX0KKworCQlpZiAoIWluY29tcGxldGUgJiYgKGdldGN1cnJlbnR0aW1lKCkgPj0gY29tcGxldGVfdGltZSkpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGdldGN1cnJlbnR0aW1lKCkgPj0gdGltZW91dCkgeworCQkJYnJlYWs7CisJCX0KKworCQltc2xlZXBfYXBwcm94KDI1MCk7CisJfQorCisJLyogTG9jayA9PiBza2lwIG92ZXJsYXBwaW5nIGNoYW5uZWxzLiAqLworCXVpbnQzMl90IG1heF9uZXh0X2ZyZXF1ZW5jeSA9IHJlc3VsdC0+ZnJlcXVlbmN5IC0gNTUwMDAwMDsKKwl3aGlsZSAoMSkgeworCQlpZiAoIXNjYW4tPm5leHRfY2hhbm5lbCkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaGRob21lcnVuX2NoYW5uZWxfZW50cnlfZnJlcXVlbmN5KHNjYW4tPm5leHRfY2hhbm5lbCkgPD0gbWF4X25leHRfZnJlcXVlbmN5KSB7CisJCQlicmVhazsKKwkJfQorCisJCXNjYW4tPm5leHRfY2hhbm5lbCA9IGhkaG9tZXJ1bl9jaGFubmVsX2xpc3RfcHJldihzY2FuLT5jaGFubmVsX2xpc3QsIHNjYW4tPm5leHRfY2hhbm5lbCk7CisJfQorCisJLyogU3VjY2Vzcy4gKi8KKwlyZXR1cm4gMTsKK30KKwordWludDhfdCBjaGFubmVsc2Nhbl9nZXRfcHJvZ3Jlc3Moc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpzY2FuKQoreworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV90ICplbnRyeSA9IHNjYW4tPm5leHRfY2hhbm5lbDsKKwlpZiAoIWVudHJ5KSB7CisJCXJldHVybiAxMDA7CisJfQorCisJdWludDMyX3QgY2hhbm5lbHNfcmVtYWluaW5nID0gMTsKKwl1aW50MzJfdCBmcmVxdWVuY3kgPSBoZGhvbWVydW5fY2hhbm5lbF9lbnRyeV9mcmVxdWVuY3koZW50cnkpOworCisJd2hpbGUgKDEpIHsKKwkJZW50cnkgPSBoZGhvbWVydW5fY2hhbm5lbF9saXN0X3ByZXYoc2Nhbi0+Y2hhbm5lbF9saXN0LCBlbnRyeSk7CisJCWlmICghZW50cnkpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X2ZyZXF1ZW5jeShlbnRyeSkgIT0gZnJlcXVlbmN5KSB7CisJCQljaGFubmVsc19yZW1haW5pbmcrKzsKKwkJCWZyZXF1ZW5jeSA9IGhkaG9tZXJ1bl9jaGFubmVsX2VudHJ5X2ZyZXF1ZW5jeShlbnRyeSk7CisJCX0KKwl9CisKKwlyZXR1cm4gc2Nhbi0+c2Nhbm5lZF9jaGFubmVscyAqIDEwMCAvIChzY2FuLT5zY2FubmVkX2NoYW5uZWxzICsgY2hhbm5lbHNfcmVtYWluaW5nKTsKK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY2hhbm5lbHNjYW4uaCBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY2hhbm5lbHNjYW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YTFmYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jaGFubmVsc2Nhbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBoZGhvbWVydW5fY2hhbm5lbHNjYW4uaAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMDggU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgSERIT01FUlVOX0NIQU5ORUxTQ0FOX1BST0dSQU1fTk9STUFMIDAKKyNkZWZpbmUgSERIT01FUlVOX0NIQU5ORUxTQ0FOX1BST0dSQU1fTk9EQVRBIDEKKyNkZWZpbmUgSERIT01FUlVOX0NIQU5ORUxTQ0FOX1BST0dSQU1fQ09OVFJPTCAyCisjZGVmaW5lIEhESE9NRVJVTl9DSEFOTkVMU0NBTl9QUk9HUkFNX0VOQ1JZUFRFRCAzCisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdDsKKworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpjaGFubmVsc2Nhbl9jcmVhdGUoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKmNoYW5uZWxtYXApOworZXh0ZXJuIExJQlRZUEUgdm9pZCBjaGFubmVsc2Nhbl9kZXN0cm95KHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCAqc2Nhbik7CisKK2V4dGVybiBMSUJUWVBFIGludCBjaGFubmVsc2Nhbl9hZHZhbmNlKHN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fdCAqc2Nhbiwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCAqcmVzdWx0KTsKK2V4dGVybiBMSUJUWVBFIGludCBjaGFubmVsc2Nhbl9kZXRlY3Qoc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpzY2FuLCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Jlc3VsdF90ICpyZXN1bHQpOworZXh0ZXJuIExJQlRZUEUgdWludDhfdCBjaGFubmVsc2Nhbl9nZXRfcHJvZ3Jlc3Moc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpzY2FuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY29uZmlnLmMgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4ODI2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NvbmZpZy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogaGRob21lcnVuX2NvbmZpZy5jCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAwOCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJoZGhvbWVydW4uaCIKKworLyoKKyAqIFRoZSBjb25zb2xlIG91dHB1dCBmb3JtYXQgc2hvdWxkIGJlIHNldCB0byBVVEYtOCwgaG93ZXZlciBpbiBYUCBhbmQgVmlzdGEgdGhpcyBicmVha3MgYmF0Y2ggZmlsZSBwcm9jZXNzaW5nLgorICogQXR0ZW1wdGluZyB0byByZXN0b3JlIG9uIGV4aXQgZmFpbHMgdG8gcmVzdG9yZSBpZiB0aGUgcHJvZ3JhbSBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSB1c2VyLgorICogU29sdXRpb24gLSBzZXQgdGhlIG91dHB1dCBmb3JtYXQgZWFjaCBwcmludGYuCisgKi8KKyNpZiBkZWZpbmVkKF9fV0lORE9XU19fKQorI2RlZmluZSBwcmludGYgY29uc29sZV9wcmludGYKKyNkZWZpbmUgdnByaW50ZiBjb25zb2xlX3ZwcmludGYKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqYXBwbmFtZTsKKworc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQ7CisKK3N0YXRpYyBpbnQgaGVscCh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6XG4iKTsKKwlwcmludGYoIlx0JXMgZGlzY292ZXJcbiIsIGFwcG5hbWUpOworCXByaW50ZigiXHQlcyA8aWQ+IGdldCBoZWxwXG4iLCBhcHBuYW1lKTsKKwlwcmludGYoIlx0JXMgPGlkPiBnZXQgPGl0ZW0+XG4iLCBhcHBuYW1lKTsKKwlwcmludGYoIlx0JXMgPGlkPiBzZXQgPGl0ZW0+IDx2YWx1ZT5cbiIsIGFwcG5hbWUpOworCXByaW50ZigiXHQlcyA8aWQ+IHNjYW4gPHR1bmVyPiBbPGZpbGVuYW1lPl1cbiIsIGFwcG5hbWUpOworCXByaW50ZigiXHQlcyA8aWQ+IHNhdmUgPHR1bmVyPiA8ZmlsZW5hbWU+XG4iLCBhcHBuYW1lKTsKKwlwcmludGYoIlx0JXMgPGlkPiB1cGdyYWRlIDxmaWxlbmFtZT5cbiIsIGFwcG5hbWUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdF9hcHBuYW1lKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworCWNvbnN0IGNoYXIgKnB0ciA9IHN0cnJjaHIoYXJndjAsICcvJyk7CisJaWYgKHB0cikgeworCQlhcmd2MCA9IHB0ciArIDE7CisJfQorCXB0ciA9IHN0cnJjaHIoYXJndjAsICdcXCcpOworCWlmIChwdHIpIHsKKwkJYXJndjAgPSBwdHIgKyAxOworCX0KKwlhcHBuYW1lID0gYXJndjA7Cit9CisKK3N0YXRpYyBib29sX3QgY29udGFpbnMoY29uc3QgY2hhciAqYXJnLCBjb25zdCBjaGFyICpjbXBzdHIpCit7CisJaWYgKHN0cmNtcChhcmcsIGNtcHN0cikgPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZiAoKmFyZysrICE9ICctJykgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICgqYXJnKysgIT0gJy0nKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKHN0cmNtcChhcmcsIGNtcHN0cikgPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBwYXJzZV9pcF9hZGRyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIGFbNF07CisJaWYgKHNzY2FuZihzdHIsICIlbHUuJWx1LiVsdS4lbHUiLCAmYVswXSwgJmFbMV0sICZhWzJdLCAmYVszXSkgIT0gNCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKHVpbnQzMl90KSgoYVswXSA8PCAyNCkgfCAoYVsxXSA8PCAxNikgfCAoYVsyXSA8PCA4KSB8IChhWzNdIDw8IDApKTsKK30KKworc3RhdGljIGludCBkaXNjb3Zlcl9wcmludChjaGFyICp0YXJnZXRfaXBfc3RyKQoreworCXVpbnQzMl90IHRhcmdldF9pcCA9IDA7CisJaWYgKHRhcmdldF9pcF9zdHIpIHsKKwkJdGFyZ2V0X2lwID0gcGFyc2VfaXBfYWRkcih0YXJnZXRfaXBfc3RyKTsKKwkJaWYgKHRhcmdldF9pcCA9PSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgaXAgYWRkcmVzczogJXNcbiIsIHRhcmdldF9pcF9zdHIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCByZXN1bHRfbGlzdFs2NF07CisJaW50IGNvdW50ID0gaGRob21lcnVuX2Rpc2NvdmVyX2ZpbmRfZGV2aWNlc19jdXN0b20odGFyZ2V0X2lwLCBIREhPTUVSVU5fREVWSUNFX1RZUEVfVFVORVIsIEhESE9NRVJVTl9ERVZJQ0VfSURfV0lMRENBUkQsIHJlc3VsdF9saXN0LCA2NCk7CisJaWYgKGNvdW50IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHNlbmRpbmcgZGlzY292ZXIgcmVxdWVzdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNvdW50ID09IDApIHsKKwkJcHJpbnRmKCJubyBkZXZpY2VzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW50IGluZGV4OworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgKnJlc3VsdCA9ICZyZXN1bHRfbGlzdFtpbmRleF07CisJCXByaW50ZigiaGRob21lcnVuIGRldmljZSAlMDhsWCBmb3VuZCBhdCAldS4ldS4ldS4ldVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXJlc3VsdC0+ZGV2aWNlX2lkLAorCQkJKHVuc2lnbmVkIGludCkocmVzdWx0LT5pcF9hZGRyID4+IDI0KSAmIDB4MEZGLCAodW5zaWduZWQgaW50KShyZXN1bHQtPmlwX2FkZHIgPj4gMTYpICYgMHgwRkYsCisJCQkodW5zaWduZWQgaW50KShyZXN1bHQtPmlwX2FkZHIgPj4gOCkgJiAweDBGRiwgKHVuc2lnbmVkIGludCkocmVzdWx0LT5pcF9hZGRyID4+IDApICYgMHgwRkYKKwkJKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgY21kX2dldChjb25zdCBjaGFyICppdGVtKQoreworCWNoYXIgKnJldF92YWx1ZTsKKwljaGFyICpyZXRfZXJyb3I7CisJaWYgKGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3ZhcihoZCwgaXRlbSwgJnJldF92YWx1ZSwgJnJldF9lcnJvcikgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY29tbXVuaWNhdGlvbiBlcnJvciBzZW5kaW5nIHJlcXVlc3QgdG8gaGRob21lcnVuIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmV0X2Vycm9yKSB7CisJCXByaW50ZigiJXNcbiIsIHJldF9lcnJvcik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ZigiJXNcbiIsIHJldF92YWx1ZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NldF9pbnRlcm5hbChjb25zdCBjaGFyICppdGVtLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljaGFyICpyZXRfZXJyb3I7CisJaWYgKGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3ZhcihoZCwgaXRlbSwgdmFsdWUsIE5VTEwsICZyZXRfZXJyb3IpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvbW11bmljYXRpb24gZXJyb3Igc2VuZGluZyByZXF1ZXN0IHRvIGhkaG9tZXJ1biBkZXZpY2VcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJldF9lcnJvcikgeworCQlwcmludGYoIiVzXG4iLCByZXRfZXJyb3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfc2V0KGNvbnN0IGNoYXIgKml0ZW0sIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmIChzdHJjbXAodmFsdWUsICItIikgPT0gMCkgeworCQljaGFyICpidWZmZXIgPSBOVUxMOworCQlzaXplX3QgcG9zID0gMDsKKworCQl3aGlsZSAoMSkgeworCQkJYnVmZmVyID0gKGNoYXIgKilyZWFsbG9jKGJ1ZmZlciwgcG9zICsgMTAyNCk7CisJCQlpZiAoIWJ1ZmZlcikgeworCQkJCWZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlzaXplX3Qgc2l6ZSA9IGZyZWFkKGJ1ZmZlciArIHBvcywgMSwgMTAyNCwgc3RkaW4pOworCQkJcG9zICs9IHNpemU7CisKKwkJCWlmIChzaXplIDwgMTAyNCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYnVmZmVyW3Bvc10gPSAwOworCisJCWludCByZXQgPSBjbWRfc2V0X2ludGVybmFsKGl0ZW0sIGJ1ZmZlcik7CisKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfc2V0X2ludGVybmFsKGl0ZW0sIHZhbHVlKTsKK30KKworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBzaWdhYm9ydF9mbGFnID0gRkFMU0U7CitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHNpZ2luZm9fZmxhZyA9IEZBTFNFOworIAorc3RhdGljIHZvaWQgc2lnYWJvcnRfaGFuZGxlcihpbnQgYXJnKQoreworCXNpZ2Fib3J0X2ZsYWcgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZCBzaWdpbmZvX2hhbmRsZXIoaW50IGFyZykKK3sKKwlzaWdpbmZvX2ZsYWcgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9zaWduYWxfaGFuZGxlcnMoc2lnX3Qgc2lncGlwZV9oYW5kbGVyLCBzaWdfdCBzaWdpbnRfaGFuZGxlciwgc2lnX3Qgc2lnaW5mb19oYW5kbGVyKQoreworI2lmIGRlZmluZWQoU0lHUElQRSkKKwlzaWduYWwoU0lHUElQRSwgc2lncGlwZV9oYW5kbGVyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHSU5UKQorCXNpZ25hbChTSUdJTlQsIHNpZ2ludF9oYW5kbGVyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHSU5GTykKKwlzaWduYWwoU0lHSU5GTywgc2lnaW5mb19oYW5kbGVyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjbWRfc2Nhbl9wcmludGYoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisKKwlpZiAoZnApIHsKKwkJdmFfbGlzdCBhcGM7CisJCXZhX2NvcHkoYXBjLCBhcCk7CisKKwkJdmZwcmludGYoZnAsIGZtdCwgYXBjKTsKKwkJZmZsdXNoKGZwKTsKKworCQl2YV9lbmQoYXBjKTsKKwl9CisKKwl2cHJpbnRmKGZtdCwgYXApOworCWZmbHVzaChzdGRvdXQpOworCisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIGludCBjbWRfc2Nhbihjb25zdCBjaGFyICp0dW5lcl9zdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWlmIChoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9mcm9tX3N0cihoZCwgdHVuZXJfc3RyKSA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB0dW5lciBudW1iZXJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciAqcmV0X2Vycm9yOworCWlmIChoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVxdWVzdChoZCwgJnJldF9lcnJvcikgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBsb2NrIHR1bmVyXG4iKTsKKwkJaWYgKHJldF9lcnJvcikgeworCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgcmV0X2Vycm9yKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfdGFyZ2V0KGhkLCAibm9uZSIpOworCisJY2hhciAqY2hhbm5lbG1hcDsKKwlpZiAoaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfY2hhbm5lbG1hcChoZCwgJmNoYW5uZWxtYXApIDw9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcXVlcnkgY2hhbm5lbG1hcCBmcm9tIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljb25zdCBjaGFyICpjaGFubmVsbWFwX3NjYW5fZ3JvdXAgPSBoZGhvbWVydW5fY2hhbm5lbG1hcF9nZXRfY2hhbm5lbG1hcF9zY2FuX2dyb3VwKGNoYW5uZWxtYXApOworCWlmICghY2hhbm5lbG1hcF9zY2FuX2dyb3VwKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBjaGFubmVsbWFwICclcydcbiIsIGNoYW5uZWxtYXApOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5faW5pdChoZCwgY2hhbm5lbG1hcF9zY2FuX2dyb3VwKSA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgY2hhbm5lbCBzY2FuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUZJTEUgKmZwID0gTlVMTDsKKwlpZiAoZmlsZW5hbWUpIHsKKwkJZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKKwkJaWYgKCFmcCkgeworCQkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY3JlYXRlIGZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcnMoc2lnYWJvcnRfaGFuZGxlciwgc2lnYWJvcnRfaGFuZGxlciwgc2lnaW5mb19oYW5kbGVyKTsKKworCWludCByZXQgPSAwOworCXdoaWxlICghc2lnYWJvcnRfZmxhZykgeworCQlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Jlc3VsdF90IHJlc3VsdDsKKwkJcmV0ID0gaGRob21lcnVuX2RldmljZV9jaGFubmVsc2Nhbl9hZHZhbmNlKGhkLCAmcmVzdWx0KTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWNtZF9zY2FuX3ByaW50ZihmcCwgIlNDQU5OSU5HOiAlbHUgKCVzKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXJlc3VsdC5mcmVxdWVuY3ksIHJlc3VsdC5jaGFubmVsX3N0cgorCQkpOworCisJCXJldCA9IGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5fZGV0ZWN0KGhkLCAmcmVzdWx0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXQgPT0gMCkgeworCQkJY29udGludWU7CisJCX0KKworCQljbWRfc2Nhbl9wcmludGYoZnAsICJMT0NLOiAlcyAoc3M9JXUgc25xPSV1IHNlcT0ldSlcbiIsCisJCQlyZXN1bHQuc3RhdHVzLmxvY2tfc3RyLCByZXN1bHQuc3RhdHVzLnNpZ25hbF9zdHJlbmd0aCwKKwkJCXJlc3VsdC5zdGF0dXMuc2lnbmFsX3RvX25vaXNlX3F1YWxpdHksIHJlc3VsdC5zdGF0dXMuc3ltYm9sX2Vycm9yX3F1YWxpdHkKKwkJKTsKKworCQlpZiAocmVzdWx0LnRyYW5zcG9ydF9zdHJlYW1faWRfZGV0ZWN0ZWQpIHsKKwkJCWNtZF9zY2FuX3ByaW50ZihmcCwgIlRTSUQ6IDB4JTA0WFxuIiwgcmVzdWx0LnRyYW5zcG9ydF9zdHJlYW1faWQpOworCQl9CisKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCByZXN1bHQucHJvZ3JhbV9jb3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Byb2dyYW1fdCAqcHJvZ3JhbSA9ICZyZXN1bHQucHJvZ3JhbXNbaV07CisJCQljbWRfc2Nhbl9wcmludGYoZnAsICJQUk9HUkFNICVzXG4iLCBwcm9ncmFtLT5wcm9ncmFtX3N0cik7CisJCX0KKwl9CisKKwloZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZShoZCk7CisKKwlpZiAoZnApIHsKKwkJZmNsb3NlKGZwKTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb21tdW5pY2F0aW9uIGVycm9yIHNlbmRpbmcgcmVxdWVzdCB0byBoZGhvbWVydW4gZGV2aWNlXG4iKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY21kX3NhdmVfcHJpbnRfc3RhdHModm9pZCkKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3N0YXRzX3Qgc3RhdHM7CisJaGRob21lcnVuX2RldmljZV9nZXRfdmlkZW9fc3RhdHMoaGQsICZzdGF0cyk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiV1IHBhY2tldHMgcmVjZWl2ZWQsICV1IG92ZXJmbG93IGVycm9ycywgJXUgbmV0d29yayBlcnJvcnMsICV1IHRyYW5zcG9ydCBlcnJvcnMsICV1IHNlcXVlbmNlIGVycm9yc1xuIiwKKwkJKHVuc2lnbmVkIGludClzdGF0cy5wYWNrZXRfY291bnQsIAorCQkodW5zaWduZWQgaW50KXN0YXRzLm92ZXJmbG93X2Vycm9yX2NvdW50LAorCQkodW5zaWduZWQgaW50KXN0YXRzLm5ldHdvcmtfZXJyb3JfY291bnQsIAorCQkodW5zaWduZWQgaW50KXN0YXRzLnRyYW5zcG9ydF9lcnJvcl9jb3VudCwgCisJCSh1bnNpZ25lZCBpbnQpc3RhdHMuc2VxdWVuY2VfZXJyb3JfY291bnQKKwkpOworfQorCitzdGF0aWMgaW50IGNtZF9zYXZlKGNvbnN0IGNoYXIgKnR1bmVyX3N0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaWYgKGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2Zyb21fc3RyKGhkLCB0dW5lcl9zdHIpIDw9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHR1bmVyIG51bWJlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlGSUxFICpmcDsKKwlpZiAoc3RyY21wKGZpbGVuYW1lLCAibnVsbCIpID09IDApIHsKKwkJZnAgPSBOVUxMOworCX0gZWxzZSBpZiAoc3RyY21wKGZpbGVuYW1lLCAiLSIpID09IDApIHsKKwkJZnAgPSBzdGRvdXQ7CisJfSBlbHNlIHsKKwkJZnAgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisJCWlmICghZnApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpbnQgcmV0ID0gaGRob21lcnVuX2RldmljZV9zdHJlYW1fc3RhcnQoaGQpOworCWlmIChyZXQgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBzdHJlYW1cbiIpOworCQlpZiAoZnAgJiYgZnAgIT0gc3Rkb3V0KSB7CisJCQlmY2xvc2UoZnApOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXJzKHNpZ2Fib3J0X2hhbmRsZXIsIHNpZ2Fib3J0X2hhbmRsZXIsIHNpZ2luZm9faGFuZGxlcik7CisKKwlzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3N0YXRzX3Qgc3RhdHNfb2xkLCBzdGF0c19jdXI7CisJaGRob21lcnVuX2RldmljZV9nZXRfdmlkZW9fc3RhdHMoaGQsICZzdGF0c19vbGQpOworCisJdWludDY0X3QgbmV4dF9wcm9ncmVzcyA9IGdldGN1cnJlbnR0aW1lKCkgKyAxMDAwOworCisJd2hpbGUgKCFzaWdhYm9ydF9mbGFnKSB7CisJCXVpbnQ2NF90IGxvb3Bfc3RhcnRfdGltZSA9IGdldGN1cnJlbnR0aW1lKCk7CisKKwkJaWYgKHNpZ2luZm9fZmxhZykgeworCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQkJY21kX3NhdmVfcHJpbnRfc3RhdHMoKTsKKwkJCXNpZ2luZm9fZmxhZyA9IEZBTFNFOworCQl9CisKKwkJc2l6ZV90IGFjdHVhbF9zaXplOworCQl1aW50OF90ICpwdHIgPSBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9yZWN2KGhkLCBWSURFT19EQVRBX0JVRkZFUl9TSVpFXzFTLCAmYWN0dWFsX3NpemUpOworCQlpZiAoIXB0cikgeworCQkJbXNsZWVwX2FwcHJveCg2NCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmcCkgeworCQkJaWYgKGZ3cml0ZShwdHIsIDEsIGFjdHVhbF9zaXplLCBmcCkgIT0gYWN0dWFsX3NpemUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHdyaXRpbmcgb3V0cHV0XG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlpZiAobG9vcF9zdGFydF90aW1lID49IG5leHRfcHJvZ3Jlc3MpIHsKKwkJCW5leHRfcHJvZ3Jlc3MgKz0gMTAwMDsKKwkJCWlmIChsb29wX3N0YXJ0X3RpbWUgPj0gbmV4dF9wcm9ncmVzcykgeworCQkJCW5leHRfcHJvZ3Jlc3MgPSBsb29wX3N0YXJ0X3RpbWUgKyAxMDAwOworCQkJfQorCisJCQkvKiBXaW5kb3dzIC0gaW5kaWNhdGUgYWN0aXZpdHkgdG8gc3VwcHJlc3MgYXV0byBzbGVlcCBtb2RlLiAqLworCQkJI2lmIGRlZmluZWQoX19XSU5ET1dTX18pCisJCQlTZXRUaHJlYWRFeGVjdXRpb25TdGF0ZShFU19TWVNURU1fUkVRVUlSRUQpOworCQkJI2VuZGlmCisKKwkJCS8qIFZpZGVvIHN0YXRzLiAqLworCQkJaGRob21lcnVuX2RldmljZV9nZXRfdmlkZW9fc3RhdHMoaGQsICZzdGF0c19jdXIpOworCisJCQlpZiAoc3RhdHNfY3VyLm92ZXJmbG93X2Vycm9yX2NvdW50ID4gc3RhdHNfb2xkLm92ZXJmbG93X2Vycm9yX2NvdW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJvIik7CisJCQl9IGVsc2UgaWYgKHN0YXRzX2N1ci5uZXR3b3JrX2Vycm9yX2NvdW50ID4gc3RhdHNfb2xkLm5ldHdvcmtfZXJyb3JfY291bnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm4iKTsKKwkJCX0gZWxzZSBpZiAoc3RhdHNfY3VyLnRyYW5zcG9ydF9lcnJvcl9jb3VudCA+IHN0YXRzX29sZC50cmFuc3BvcnRfZXJyb3JfY291bnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInQiKTsKKwkJCX0gZWxzZSBpZiAoc3RhdHNfY3VyLnNlcXVlbmNlX2Vycm9yX2NvdW50ID4gc3RhdHNfb2xkLnNlcXVlbmNlX2Vycm9yX2NvdW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJzIik7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiLiIpOworCQkJfQorCisJCQlzdGF0c19vbGQgPSBzdGF0c19jdXI7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJfQorCisJCWludDMyX3QgZGVsYXkgPSA2NCAtIChpbnQzMl90KShnZXRjdXJyZW50dGltZSgpIC0gbG9vcF9zdGFydF90aW1lKTsKKwkJaWYgKGRlbGF5IDw9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbXNsZWVwX2FwcHJveChkZWxheSk7CisJfQorCisJaWYgKGZwKSB7CisJCWZjbG9zZShmcCk7CisJfQorCisJaGRob21lcnVuX2RldmljZV9zdHJlYW1fc3RvcChoZCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICItLSBWaWRlbyBzdGF0aXN0aWNzIC0tXG4iKTsKKwljbWRfc2F2ZV9wcmludF9zdGF0cygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3VwZ3JhZGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisJaWYgKCFmcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ZigidXBsb2FkaW5nIGZpcm13YXJlLi4uXG4iKTsKKwlpZiAoaGRob21lcnVuX2RldmljZV91cGdyYWRlKGhkLCBmcCkgPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHNlbmRpbmcgdXBncmFkZSBmaWxlIHRvIGhkaG9tZXJ1biBkZXZpY2VcbiIpOworCQlmY2xvc2UoZnApOworCQlyZXR1cm4gLTE7CisJfQorCisJZmNsb3NlKGZwKTsKKwltc2xlZXBfbWluaW11bSgyMDAwKTsKKworCXByaW50ZigidXBncmFkaW5nIGZpcm13YXJlLi4uXG4iKTsKKwltc2xlZXBfbWluaW11bSg4MDAwKTsKKworCXByaW50ZigicmVib290aW5nLi4uXG4iKTsKKwlpbnQgY291bnQgPSAwOworCWNoYXIgKnZlcnNpb25fc3RyOworCXdoaWxlICgxKSB7CisJCWlmIChoZGhvbWVydW5fZGV2aWNlX2dldF92ZXJzaW9uKGhkLCAmdmVyc2lvbl9zdHIsIE5VTEwpID49IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gMzApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3IgZmluZGluZyBkZXZpY2UgYWZ0ZXIgZmlybXdhcmUgdXBncmFkZVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQltc2xlZXBfbWluaW11bSgxMDAwKTsKKwl9CisKKwlwcmludGYoInVwZ3JhZGUgY29tcGxldGUgLSBub3cgcnVubmluZyBmaXJtd2FyZSAlc1xuIiwgdmVyc2lvbl9zdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZF9leGVjdXRlKHZvaWQpCit7CisJY2hhciAqcmV0X3ZhbHVlOworCWNoYXIgKnJldF9lcnJvcjsKKwlpZiAoaGRob21lcnVuX2RldmljZV9nZXRfdmFyKGhkLCAiL3N5cy9ib290IiwgJnJldF92YWx1ZSwgJnJldF9lcnJvcikgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY29tbXVuaWNhdGlvbiBlcnJvciBzZW5kaW5nIHJlcXVlc3QgdG8gaGRob21lcnVuIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmV0X2Vycm9yKSB7CisJCXByaW50ZigiJXNcbiIsIHJldF9lcnJvcik7CisJCXJldHVybiAwOworCX0KKworCWNoYXIgKmVuZCA9IHJldF92YWx1ZSArIHN0cmxlbihyZXRfdmFsdWUpOworCWNoYXIgKnBvcyA9IHJldF92YWx1ZTsKKworCXdoaWxlICgxKSB7CisJCWlmIChwb3MgPj0gZW5kKSB7CisJCQlicmVhazsKKwkJfQorCisJCWNoYXIgKmVvbF9yID0gc3RyY2hyKHBvcywgJ1xyJyk7CisJCWlmICghZW9sX3IpIHsKKwkJCWVvbF9yID0gZW5kOworCQl9CisKKwkJY2hhciAqZW9sX24gPSBzdHJjaHIocG9zLCAnXG4nKTsKKwkJaWYgKCFlb2xfbikgeworCQkJZW9sX24gPSBlbmQ7CisJCX0KKworCQljaGFyICplb2wgPSBlb2xfcjsKKwkJaWYgKGVvbF9uIDwgZW9sKSB7CisJCQllb2wgPSBlb2xfbjsKKwkJfQorCisJCWNoYXIgKnNlcCA9IHN0cmNocihwb3MsICcgJyk7CisJCWlmICghc2VwIHx8IHNlcCA+IGVvbCkgeworCQkJcG9zID0gZW9sICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJKnNlcCA9IDA7CisJCSplb2wgPSAwOworCisJCWNoYXIgKml0ZW0gPSBwb3M7CisJCWNoYXIgKnZhbHVlID0gc2VwICsgMTsKKworCQlwcmludGYoInNldCAlcyBcIiVzXCJcbiIsIGl0ZW0sIHZhbHVlKTsKKworCQljbWRfc2V0X2ludGVybmFsKGl0ZW0sIHZhbHVlKTsKKworCQlwb3MgPSBlb2wgKyAxOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1haW5fY21kKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKGFyZ2MgPCAxKSB7CisJCXJldHVybiBoZWxwKCk7CisJfQorCisJY2hhciAqY21kID0gKmFyZ3YrKzsgYXJnYy0tOworCisJaWYgKGNvbnRhaW5zKGNtZCwgImtleSIpKSB7CisJCWlmIChhcmdjIDwgMikgeworCQkJcmV0dXJuIGhlbHAoKTsKKwkJfQorCQl1aW50MzJfdCBsb2Nra2V5ID0gc3RydG91bChhcmd2WzBdLCBOVUxMLCAwKTsKKwkJaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3VzZV92YWx1ZShoZCwgbG9ja2tleSk7CisKKwkJY21kID0gYXJndlsxXTsKKwkJYXJndis9MjsgYXJnYy09MjsKKwl9CisKKwlpZiAoY29udGFpbnMoY21kLCAiZ2V0IikpIHsKKwkJaWYgKGFyZ2MgPCAxKSB7CisJCQlyZXR1cm4gaGVscCgpOworCQl9CisJCXJldHVybiBjbWRfZ2V0KGFyZ3ZbMF0pOworCX0KKworCWlmIChjb250YWlucyhjbWQsICJzZXQiKSkgeworCQlpZiAoYXJnYyA8IDIpIHsKKwkJCXJldHVybiBoZWxwKCk7CisJCX0KKwkJcmV0dXJuIGNtZF9zZXQoYXJndlswXSwgYXJndlsxXSk7CisJfQorCisJaWYgKGNvbnRhaW5zKGNtZCwgInNjYW4iKSkgeworCQlpZiAoYXJnYyA8IDEpIHsKKwkJCXJldHVybiBoZWxwKCk7CisJCX0KKwkJaWYgKGFyZ2MgPCAyKSB7CisJCQlyZXR1cm4gY21kX3NjYW4oYXJndlswXSwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY21kX3NjYW4oYXJndlswXSwgYXJndlsxXSk7CisJCX0KKwl9CisKKwlpZiAoY29udGFpbnMoY21kLCAic2F2ZSIpKSB7CisJCWlmIChhcmdjIDwgMikgeworCQkJcmV0dXJuIGhlbHAoKTsKKwkJfQorCQlyZXR1cm4gY21kX3NhdmUoYXJndlswXSwgYXJndlsxXSk7CisJfQorCisJaWYgKGNvbnRhaW5zKGNtZCwgInVwZ3JhZGUiKSkgeworCQlpZiAoYXJnYyA8IDEpIHsKKwkJCXJldHVybiBoZWxwKCk7CisJCX0KKwkJcmV0dXJuIGNtZF91cGdyYWRlKGFyZ3ZbMF0pOworCX0KKworCWlmIChjb250YWlucyhjbWQsICJleGVjdXRlIikpIHsKKwkJcmV0dXJuIGNtZF9leGVjdXRlKCk7CisJfQorCisJcmV0dXJuIGhlbHAoKTsKK30KKworc3RhdGljIGludCBtYWluX2ludGVybmFsKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgZGVmaW5lZChfX1dJTkRPV1NfXykKKwkvKiBJbml0aWFsaXplIG5ldHdvcmsgc29ja2V0IHN1cHBvcnQuICovCisJV09SRCB3VmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEKDIsIDApOworCVdTQURBVEEgd3NhRGF0YTsKKwlXU0FTdGFydHVwKHdWZXJzaW9uUmVxdWVzdGVkLCAmd3NhRGF0YSk7CisjZW5kaWYKKworCWV4dHJhY3RfYXBwbmFtZShhcmd2WzBdKTsKKwlhcmd2Kys7CisJYXJnYy0tOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlyZXR1cm4gaGVscCgpOworCX0KKworCWNoYXIgKmlkX3N0ciA9ICphcmd2Kys7IGFyZ2MtLTsKKwlpZiAoY29udGFpbnMoaWRfc3RyLCAiaGVscCIpKSB7CisJCXJldHVybiBoZWxwKCk7CisJfQorCWlmIChjb250YWlucyhpZF9zdHIsICJkaXNjb3ZlciIpKSB7CisJCWlmIChhcmdjIDwgMSkgeworCQkJcmV0dXJuIGRpc2NvdmVyX3ByaW50KE5VTEwpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGRpc2NvdmVyX3ByaW50KGFyZ3ZbMF0pOworCQl9CisJfQorCisJLyogRGV2aWNlIG9iamVjdC4gKi8KKwloZCA9IGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyKGlkX3N0ciwgTlVMTCk7CisJaWYgKCFoZCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgZGV2aWNlIGlkOiAlc1xuIiwgaWRfc3RyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERldmljZSBJRCBjaGVjay4gKi8KKwl1aW50MzJfdCBkZXZpY2VfaWRfcmVxdWVzdGVkID0gaGRob21lcnVuX2RldmljZV9nZXRfZGV2aWNlX2lkX3JlcXVlc3RlZChoZCk7CisJaWYgKCFoZGhvbWVydW5fZGlzY292ZXJfdmFsaWRhdGVfZGV2aWNlX2lkKGRldmljZV9pZF9yZXF1ZXN0ZWQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBkZXZpY2UgaWQ6ICUwOGxYXG4iLCAodW5zaWduZWQgbG9uZylkZXZpY2VfaWRfcmVxdWVzdGVkKTsKKwl9CisKKwkvKiBDb25uZWN0IHRvIGRldmljZSBhbmQgY2hlY2sgbW9kZWwuICovCisJY29uc3QgY2hhciAqbW9kZWwgPSBoZGhvbWVydW5fZGV2aWNlX2dldF9tb2RlbF9zdHIoaGQpOworCWlmICghbW9kZWwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY29ubmVjdCB0byBkZXZpY2VcbiIpOworCQloZGhvbWVydW5fZGV2aWNlX2Rlc3Ryb3koaGQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ29tbWFuZC4gKi8KKwlpbnQgcmV0ID0gbWFpbl9jbWQoYXJnYywgYXJndik7CisKKwkvKiBDbGVhbnVwLiAqLworCWhkaG9tZXJ1bl9kZXZpY2VfZGVzdHJveShoZCk7CisKKwkvKiBDb21wbGV0ZS4gKi8KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQgPSBtYWluX2ludGVybmFsKGFyZ2MsIGFyZ3YpOworCWlmIChyZXQgPD0gMCkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2NvbnRyb2wuYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4NzNlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NvbnRyb2wuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIGhkaG9tZXJ1bl9jb250cm9sLmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImhkaG9tZXJ1bi5oIgorCisjZGVmaW5lIEhESE9NRVJVTl9DT05UUk9MX0NPTk5FQ1RfVElNRU9VVCAyNTAwCisjZGVmaW5lIEhESE9NRVJVTl9DT05UUk9MX1NFTkRfVElNRU9VVCAyNTAwCisjZGVmaW5lIEhESE9NRVJVTl9DT05UUk9MX1JFQ1ZfVElNRU9VVCAyNTAwCisjZGVmaW5lIEhESE9NRVJVTl9DT05UUk9MX1VQR1JBREVfVElNRU9VVCAyMDAwMAorCitzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190IHsKKwl1aW50MzJfdCBkZXNpcmVkX2RldmljZV9pZDsKKwl1aW50MzJfdCBkZXNpcmVkX2RldmljZV9pcDsKKwl1aW50MzJfdCBhY3R1YWxfZGV2aWNlX2lkOworCXVpbnQzMl90IGFjdHVhbF9kZXZpY2VfaXA7CisJaGRob21lcnVuX3NvY2tfdCBzb2NrOworCXN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnOworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgdHhfcGt0OworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgcnhfcGt0OworfTsKKworc3RhdGljIHZvaWQgaGRob21lcnVuX2NvbnRyb2xfY2xvc2Vfc29jayhzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwlpZiAoY3MtPnNvY2sgPT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQlyZXR1cm47CisJfQorCisJaGRob21lcnVuX3NvY2tfZGVzdHJveShjcy0+c29jayk7CisJY3MtPnNvY2sgPSBIREhPTUVSVU5fU09DS19JTlZBTElEOworfQorCit2b2lkIGhkaG9tZXJ1bl9jb250cm9sX3NldF9kZXZpY2Uoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MsIHVpbnQzMl90IGRldmljZV9pZCwgdWludDMyX3QgZGV2aWNlX2lwKQoreworCWhkaG9tZXJ1bl9jb250cm9sX2Nsb3NlX3NvY2soY3MpOworCisJY3MtPmRlc2lyZWRfZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCWNzLT5kZXNpcmVkX2RldmljZV9pcCA9IGRldmljZV9pcDsKKwljcy0+YWN0dWFsX2RldmljZV9pZCA9IDA7CisJY3MtPmFjdHVhbF9kZXZpY2VfaXAgPSAwOworfQorCitzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpoZGhvbWVydW5fY29udHJvbF9jcmVhdGUodWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBkZXZpY2VfaXAsIHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworCXN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QgKmNzID0gKHN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QpKTsKKwlpZiAoIWNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfY3JlYXRlOiBmYWlsZWQgdG8gYWxsb2NhdGUgY29udHJvbCBvYmplY3RcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljcy0+ZGJnID0gZGJnOworCWNzLT5zb2NrID0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKwloZGhvbWVydW5fY29udHJvbF9zZXRfZGV2aWNlKGNzLCBkZXZpY2VfaWQsIGRldmljZV9pcCk7CisKKwlyZXR1cm4gY3M7Cit9CisKK3ZvaWQgaGRob21lcnVuX2NvbnRyb2xfZGVzdHJveShzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwloZGhvbWVydW5fY29udHJvbF9jbG9zZV9zb2NrKGNzKTsKKwlmcmVlKGNzKTsKK30KKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fY29udHJvbF9jb25uZWN0X3NvY2soc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MpCit7CisJaWYgKGNzLT5zb2NrICE9IEhESE9NRVJVTl9TT0NLX0lOVkFMSUQpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJaWYgKChjcy0+ZGVzaXJlZF9kZXZpY2VfaWQgPT0gMCkgJiYgKGNzLT5kZXNpcmVkX2RldmljZV9pcCA9PSAwKSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9jb25uZWN0X3NvY2s6IG5vIGRldmljZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChoZGhvbWVydW5fZGlzY292ZXJfaXNfaXBfbXVsdGljYXN0KGNzLT5kZXNpcmVkX2RldmljZV9pcCkpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfY29ubmVjdF9zb2NrOiBjYW5ub3QgdXNlIG11bHRpY2FzdCBpcCBhZGRyZXNzIGZvciBkZXZpY2Ugb3BlcmF0aW9uc1xuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKiBGaW5kIGRldmljZS4gKi8KKwlzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX2RldmljZV90IHJlc3VsdDsKKwlpZiAoaGRob21lcnVuX2Rpc2NvdmVyX2ZpbmRfZGV2aWNlc19jdXN0b20oY3MtPmRlc2lyZWRfZGV2aWNlX2lwLCBIREhPTUVSVU5fREVWSUNFX1RZUEVfV0lMRENBUkQsIGNzLT5kZXNpcmVkX2RldmljZV9pZCwgJnJlc3VsdCwgMSkgPD0gMCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9jb25uZWN0X3NvY2s6IGRldmljZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWNzLT5hY3R1YWxfZGV2aWNlX2lwID0gcmVzdWx0LmlwX2FkZHI7CisJY3MtPmFjdHVhbF9kZXZpY2VfaWQgPSByZXN1bHQuZGV2aWNlX2lkOworCisJLyogQ3JlYXRlIHNvY2tldC4gKi8KKwljcy0+c29jayA9IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV90Y3AoKTsKKwlpZiAoY3MtPnNvY2sgPT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9jb25uZWN0X3NvY2s6IGZhaWxlZCB0byBjcmVhdGUgc29ja2V0ICglZClcbiIsIGhkaG9tZXJ1bl9zb2NrX2dldGxhc3RlcnJvcigpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIEluaXRpYXRlIGNvbm5lY3Rpb24uICovCisJaWYgKCFoZGhvbWVydW5fc29ja19jb25uZWN0KGNzLT5zb2NrLCBjcy0+YWN0dWFsX2RldmljZV9pcCwgSERIT01FUlVOX0NPTlRST0xfVENQX1BPUlQsIEhESE9NRVJVTl9DT05UUk9MX0NPTk5FQ1RfVElNRU9VVCkpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfY29ubmVjdF9zb2NrOiBmYWlsZWQgdG8gY29ubmVjdCAoJWQpXG4iLCBoZGhvbWVydW5fc29ja19nZXRsYXN0ZXJyb3IoKSk7CisJCWhkaG9tZXJ1bl9jb250cm9sX2Nsb3NlX3NvY2soY3MpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogU3VjY2Vzcy4gKi8KKwlyZXR1cm4gVFJVRTsKK30KKwordWludDMyX3QgaGRob21lcnVuX2NvbnRyb2xfZ2V0X2RldmljZV9pZChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwlpZiAoIWhkaG9tZXJ1bl9jb250cm9sX2Nvbm5lY3Rfc29jayhjcykpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfZ2V0X2RldmljZV9pZDogY29ubmVjdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gY3MtPmFjdHVhbF9kZXZpY2VfaWQ7Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaXAoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MpCit7CisJaWYgKCFoZGhvbWVydW5fY29udHJvbF9jb25uZWN0X3NvY2soY3MpKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaXA6IGNvbm5lY3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGNzLT5hY3R1YWxfZGV2aWNlX2lwOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fY29udHJvbF9nZXRfZGV2aWNlX2lkX3JlcXVlc3RlZChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwlyZXR1cm4gY3MtPmRlc2lyZWRfZGV2aWNlX2lkOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fY29udHJvbF9nZXRfZGV2aWNlX2lwX3JlcXVlc3RlZChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwlyZXR1cm4gY3MtPmRlc2lyZWRfZGV2aWNlX2lwOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fY29udHJvbF9nZXRfbG9jYWxfYWRkcihzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcykKK3sKKwlpZiAoIWhkaG9tZXJ1bl9jb250cm9sX2Nvbm5lY3Rfc29jayhjcykpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfZ2V0X2xvY2FsX2FkZHI6IGNvbm5lY3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdWludDMyX3QgYWRkciA9IGhkaG9tZXJ1bl9zb2NrX2dldHNvY2tuYW1lX2FkZHIoY3MtPnNvY2spOworCWlmIChhZGRyID09IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfZ2V0X2xvY2FsX2FkZHI6IGdldHNvY2tuYW1lIGZhaWxlZCAoJWQpXG4iLCBoZGhvbWVydW5fc29ja19nZXRsYXN0ZXJyb3IoKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgYm9vbF90IGhkaG9tZXJ1bl9jb250cm9sX3NlbmRfc29jayhzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqdHhfcGt0KQoreworCWlmICghaGRob21lcnVuX3NvY2tfc2VuZChjcy0+c29jaywgdHhfcGt0LT5zdGFydCwgdHhfcGt0LT5lbmQgLSB0eF9wa3QtPnN0YXJ0LCBIREhPTUVSVU5fQ09OVFJPTF9TRU5EX1RJTUVPVVQpKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX3NlbmRfc29jazogc2VuZCBmYWlsZWQgKCVkKVxuIiwgaGRob21lcnVuX3NvY2tfZ2V0bGFzdGVycm9yKCkpOworCQloZGhvbWVydW5fY29udHJvbF9jbG9zZV9zb2NrKGNzKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgYm9vbF90IGhkaG9tZXJ1bl9jb250cm9sX3JlY3Zfc29jayhzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcnhfcGt0LCB1aW50MTZfdCAqcHR5cGUsIHVpbnQ2NF90IHJlY3ZfdGltZW91dCkKK3sKKwl1aW50NjRfdCBzdG9wX3RpbWUgPSBnZXRjdXJyZW50dGltZSgpICsgcmVjdl90aW1lb3V0OworCWhkaG9tZXJ1bl9wa3RfcmVzZXQocnhfcGt0KTsKKworCXdoaWxlICgxKSB7CisJCXVpbnQ2NF90IGN1cnJlbnRfdGltZSA9IGdldGN1cnJlbnR0aW1lKCk7CisJCWlmIChjdXJyZW50X3RpbWUgPj0gc3RvcF90aW1lKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9yZWN2X3NvY2s6IHRpbWVvdXRcbiIpOworCQkJaGRob21lcnVuX2NvbnRyb2xfY2xvc2Vfc29jayhjcyk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlzaXplX3QgbGVuZ3RoID0gcnhfcGt0LT5saW1pdCAtIHJ4X3BrdC0+ZW5kOworCQlpZiAoIWhkaG9tZXJ1bl9zb2NrX3JlY3YoY3MtPnNvY2ssIHJ4X3BrdC0+ZW5kLCAmbGVuZ3RoLCBzdG9wX3RpbWUgLSBjdXJyZW50X3RpbWUpKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9yZWN2X3NvY2s6IHJlY3YgZmFpbGVkICglZClcbiIsIGhkaG9tZXJ1bl9zb2NrX2dldGxhc3RlcnJvcigpKTsKKwkJCWhkaG9tZXJ1bl9jb250cm9sX2Nsb3NlX3NvY2soY3MpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJcnhfcGt0LT5lbmQgKz0gbGVuZ3RoOworCisJCWludCByZXQgPSBoZGhvbWVydW5fcGt0X29wZW5fZnJhbWUocnhfcGt0LCBwdHlwZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9yZWN2X3NvY2s6IGZyYW1lIGVycm9yXG4iKTsKKwkJCWhkaG9tZXJ1bl9jb250cm9sX2Nsb3NlX3NvY2soY3MpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWlmIChyZXQgPiAwKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBoZGhvbWVydW5fY29udHJvbF9zZW5kX3JlY3ZfaW50ZXJuYWwoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MsIHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnR4X3BrdCwgc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcnhfcGt0LCB1aW50MTZfdCB0eXBlLCB1aW50NjRfdCByZWN2X3RpbWVvdXQpCit7CisJaGRob21lcnVuX3BrdF9zZWFsX2ZyYW1lKHR4X3BrdCwgdHlwZSk7CisKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmIChjcy0+c29jayA9PSBIREhPTUVSVU5fU09DS19JTlZBTElEKSB7CisJCQlpZiAoIWhkaG9tZXJ1bl9jb250cm9sX2Nvbm5lY3Rfc29jayhjcykpIHsKKwkJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9zZW5kX3JlY3Y6IGNvbm5lY3QgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlpZiAoIWhkaG9tZXJ1bl9jb250cm9sX3NlbmRfc29jayhjcywgdHhfcGt0KSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyeF9wa3QpIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJdWludDE2X3QgcnNwX3R5cGU7CisJCWlmICghaGRob21lcnVuX2NvbnRyb2xfcmVjdl9zb2NrKGNzLCByeF9wa3QsICZyc3BfdHlwZSwgcmVjdl90aW1lb3V0KSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJzcF90eXBlICE9IHR5cGUgKyAxKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9zZW5kX3JlY3Y6IHVuZXhwZWN0ZWQgZnJhbWUgdHlwZVxuIik7CisJCQloZGhvbWVydW5fY29udHJvbF9jbG9zZV9zb2NrKGNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfc2VuZF9yZWN2OiBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKworaW50IGhkaG9tZXJ1bl9jb250cm9sX3NlbmRfcmVjdihzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqdHhfcGt0LCBzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpyeF9wa3QsIHVpbnQxNl90IHR5cGUpCit7CisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX3NlbmRfcmVjdl9pbnRlcm5hbChjcywgdHhfcGt0LCByeF9wa3QsIHR5cGUsIEhESE9NRVJVTl9DT05UUk9MX1JFQ1ZfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbnQgaGRob21lcnVuX2NvbnRyb2xfZ2V0X3NldChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHVpbnQzMl90IGxvY2trZXksIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpCit7CisJc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqdHhfcGt0ID0gJmNzLT50eF9wa3Q7CisJc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcnhfcGt0ID0gJmNzLT5yeF9wa3Q7CisKKwkvKiBSZXF1ZXN0LiAqLworCWhkaG9tZXJ1bl9wa3RfcmVzZXQodHhfcGt0KTsKKworCWludCBuYW1lX2xlbiA9IChpbnQpc3RybGVuKG5hbWUpICsgMTsKKwlpZiAodHhfcGt0LT5lbmQgKyAzICsgbmFtZV9sZW4gPiB0eF9wa3QtPmxpbWl0KSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX2dldF9zZXQ6IHJlcXVlc3QgdG9vIGxvbmdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdTgodHhfcGt0LCBIREhPTUVSVU5fVEFHX0dFVFNFVF9OQU1FKTsKKwloZGhvbWVydW5fcGt0X3dyaXRlX3Zhcl9sZW5ndGgodHhfcGt0LCBuYW1lX2xlbik7CisJaGRob21lcnVuX3BrdF93cml0ZV9tZW0odHhfcGt0LCAoY29uc3Qgdm9pZCAqKW5hbWUsIG5hbWVfbGVuKTsKKworCWlmICh2YWx1ZSkgeworCQlpbnQgdmFsdWVfbGVuID0gKGludClzdHJsZW4odmFsdWUpICsgMTsKKwkJaWYgKHR4X3BrdC0+ZW5kICsgMyArIHZhbHVlX2xlbiA+IHR4X3BrdC0+bGltaXQpIHsKKwkJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX2dldF9zZXQ6IHJlcXVlc3QgdG9vIGxvbmdcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdTgodHhfcGt0LCBIREhPTUVSVU5fVEFHX0dFVFNFVF9WQUxVRSk7CisJCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdmFyX2xlbmd0aCh0eF9wa3QsIHZhbHVlX2xlbik7CisJCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfbWVtKHR4X3BrdCwgKGNvbnN0IHZvaWQgKil2YWx1ZSwgdmFsdWVfbGVuKTsKKwl9CisKKwlpZiAobG9ja2tleSAhPSAwKSB7CisJCWlmICh0eF9wa3QtPmVuZCArIDYgPiB0eF9wa3QtPmxpbWl0KSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9nZXRfc2V0OiByZXF1ZXN0IHRvbyBsb25nXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQloZGhvbWVydW5fcGt0X3dyaXRlX3U4KHR4X3BrdCwgSERIT01FUlVOX1RBR19HRVRTRVRfTE9DS0tFWSk7CisJCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdmFyX2xlbmd0aCh0eF9wa3QsIDQpOworCQloZGhvbWVydW5fcGt0X3dyaXRlX3UzMih0eF9wa3QsIGxvY2trZXkpOworCX0KKworCS8qIFNlbmQvUmVjdi4gKi8KKwlpZiAoaGRob21lcnVuX2NvbnRyb2xfc2VuZF9yZWN2X2ludGVybmFsKGNzLCB0eF9wa3QsIHJ4X3BrdCwgSERIT01FUlVOX1RZUEVfR0VUU0VUX1JFUSwgSERIT01FUlVOX0NPTlRST0xfUkVDVl9USU1FT1VUKSA8IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfZ2V0X3NldDogc2VuZC9yZWN2IGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFJlc3BvbnNlLiAqLworCXdoaWxlICgxKSB7CisJCXVpbnQ4X3QgdGFnOworCQlzaXplX3QgbGVuOworCQl1aW50OF90ICpuZXh0ID0gaGRob21lcnVuX3BrdF9yZWFkX3RsdihyeF9wa3QsICZ0YWcsICZsZW4pOworCQlpZiAoIW5leHQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh0YWcpIHsKKwkJY2FzZSBIREhPTUVSVU5fVEFHX0dFVFNFVF9WQUxVRToKKwkJCWlmIChwdmFsdWUpIHsKKwkJCQkqcHZhbHVlID0gKGNoYXIgKilyeF9wa3QtPnBvczsKKwkJCQlyeF9wa3QtPnBvc1tsZW5dID0gMDsKKwkJCX0KKwkJCWlmIChwZXJyb3IpIHsKKwkJCQkqcGVycm9yID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiAxOworCisJCWNhc2UgSERIT01FUlVOX1RBR19FUlJPUl9NRVNTQUdFOgorCQkJcnhfcGt0LT5wb3NbbGVuXSA9IDA7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGNzLT5kYmcsICJoZGhvbWVydW5fY29udHJvbF9nZXRfc2V0OiAlc1xuIiwgcnhfcGt0LT5wb3MpOworCisJCQlpZiAocHZhbHVlKSB7CisJCQkJKnB2YWx1ZSA9IE5VTEw7CisJCQl9CisJCQlpZiAocGVycm9yKSB7CisJCQkJKnBlcnJvciA9IChjaGFyICopcnhfcGt0LT5wb3M7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJcnhfcGt0LT5wb3MgPSBuZXh0OworCX0KKworCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX2dldF9zZXQ6IG1pc3NpbmcgcmVzcG9uc2UgdGFnc1xuIik7CisJcmV0dXJuIC0xOworfQorCitpbnQgaGRob21lcnVuX2NvbnRyb2xfZ2V0KHN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QgKmNzLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqcHZhbHVlLCBjaGFyICoqcGVycm9yKQoreworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9nZXRfc2V0KGNzLCBuYW1lLCBOVUxMLCAwLCBwdmFsdWUsIHBlcnJvcik7Cit9CisKK2ludCBoZGhvbWVydW5fY29udHJvbF9zZXQoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBjaGFyICoqcHZhbHVlLCBjaGFyICoqcGVycm9yKQoreworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9nZXRfc2V0KGNzLCBuYW1lLCB2YWx1ZSwgMCwgcHZhbHVlLCBwZXJyb3IpOworfQorCitpbnQgaGRob21lcnVuX2NvbnRyb2xfc2V0X3dpdGhfbG9ja2tleShzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHVpbnQzMl90IGxvY2trZXksIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpCit7CisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldF9zZXQoY3MsIG5hbWUsIHZhbHVlLCBsb2Nra2V5LCBwdmFsdWUsIHBlcnJvcik7Cit9CisKK2ludCBoZGhvbWVydW5fY29udHJvbF91cGdyYWRlKHN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QgKmNzLCBGSUxFICp1cGdyYWRlX2ZpbGUpCit7CisJc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqdHhfcGt0ID0gJmNzLT50eF9wa3Q7CisJc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcnhfcGt0ID0gJmNzLT5yeF9wa3Q7CisJdWludDMyX3Qgc2VxdWVuY2UgPSAwOworCisJLyogVXBsb2FkLiAqLworCXdoaWxlICgxKSB7CisJCXVpbnQ4X3QgZGF0YVsyNTZdOworCQlzaXplX3QgbGVuZ3RoID0gZnJlYWQoZGF0YSwgMSwgMjU2LCB1cGdyYWRlX2ZpbGUpOworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaGRob21lcnVuX3BrdF9yZXNldCh0eF9wa3QpOworCQloZGhvbWVydW5fcGt0X3dyaXRlX3UzMih0eF9wa3QsIHNlcXVlbmNlKTsKKwkJaGRob21lcnVuX3BrdF93cml0ZV9tZW0odHhfcGt0LCBkYXRhLCBsZW5ndGgpOworCisJCWlmIChoZGhvbWVydW5fY29udHJvbF9zZW5kX3JlY3ZfaW50ZXJuYWwoY3MsIHR4X3BrdCwgTlVMTCwgSERIT01FUlVOX1RZUEVfVVBHUkFERV9SRVEsIDApIDwgMCkgeworCQkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfdXBncmFkZTogc2VuZC9yZWN2IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzZXF1ZW5jZSArPSAodWludDMyX3QpbGVuZ3RoOworCX0KKworCWlmIChzZXF1ZW5jZSA9PSAwKSB7CisJCS8qIE5vIGRhdGEgaW4gZmlsZS4gRXJyb3IsIGJ1dCBubyBuZWVkIHRvIGNsb3NlIGNvbm5lY3Rpb24uICovCisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX3VwZ3JhZGU6IHplcm8gbGVuZ3RoIGZpbGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFeGVjdXRlIHVwZ3JhZGUuICovCisJaGRob21lcnVuX3BrdF9yZXNldCh0eF9wa3QpOworCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdTMyKHR4X3BrdCwgMHhGRkZGRkZGRik7CisKKwlpZiAoaGRob21lcnVuX2NvbnRyb2xfc2VuZF9yZWN2X2ludGVybmFsKGNzLCB0eF9wa3QsIHJ4X3BrdCwgSERIT01FUlVOX1RZUEVfVVBHUkFERV9SRVEsIEhESE9NRVJVTl9DT05UUk9MX1VQR1JBREVfVElNRU9VVCkgPCAwKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoY3MtPmRiZywgImhkaG9tZXJ1bl9jb250cm9sX3VwZ3JhZGU6IHNlbmQvcmVjdiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgcmVzcG9uc2UuICovCisJd2hpbGUgKDEpIHsKKwkJdWludDhfdCB0YWc7CisJCXNpemVfdCBsZW47CisJCXVpbnQ4X3QgKm5leHQgPSBoZGhvbWVydW5fcGt0X3JlYWRfdGx2KHJ4X3BrdCwgJnRhZywgJmxlbik7CisJCWlmICghbmV4dCkgeworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHRhZykgeworCQljYXNlIEhESE9NRVJVTl9UQUdfRVJST1JfTUVTU0FHRToKKwkJCXJ4X3BrdC0+cG9zW2xlbl0gPSAwOworCQkJaGRob21lcnVuX2RlYnVnX3ByaW50Zihjcy0+ZGJnLCAiaGRob21lcnVuX2NvbnRyb2xfdXBncmFkZTogJXNcbiIsIChjaGFyICopcnhfcGt0LT5wb3MpOworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJcnhfcGt0LT5wb3MgPSBuZXh0OworCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jb250cm9sLmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTYwMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9jb250cm9sLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBoZGhvbWVydW5fY29udHJvbC5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190OworCisvKgorICogQ3JlYXRlIGEgY29udHJvbCBzb2NrZXQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4KKyAqIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgd2hlbiBmaXJzdCB1c2VkLgorICoKKyAqIHVpbnQzMl90IGRldmljZV9pZCA9IDMyLWJpdCBkZXZpY2UgaWQgb2YgZGV2aWNlLiBTZXQgdG8gSERIT01FUlVOX0RFVklDRV9JRF9XSUxEQ0FSRCB0byBtYXRjaCBhbnkgZGV2aWNlIElELgorICogdWludDMyX3QgZGV2aWNlX2lwID0gSVAgYWRkcmVzcyBvZiBkZXZpY2UuIFNldCB0byAwIHRvIGF1dG8tZGV0ZWN0LgorICogc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmc6IFBvaW50ZXIgdG8gZGVidWcgbG9nZ2luZyBvYmplY3QuIE1heSBiZSBOVUxMLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRyb2wgc29ja2V0LgorICoKKyAqIFdoZW4gbm8gbG9uZ2VyIG5lZWRlZCwgdGhlIHNvY2tldCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IGNhbGxpbmcgaGRob21lcnVuX2NvbnRyb2xfZGVzdHJveS4KKyAqLworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqaGRob21lcnVuX2NvbnRyb2xfY3JlYXRlKHVpbnQzMl90IGRldmljZV9pZCwgdWludDMyX3QgZGV2aWNlX2lwLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9jb250cm9sX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MpOworCisvKgorICogR2V0IHRoZSBhY3R1YWwgZGV2aWNlIGlkIG9yIGlwIG9mIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBkZXZpY2UgaWQgY2Fubm90IGJlIGRldGVybWluZWQuCisgKi8KK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaWQoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MpOworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2NvbnRyb2xfZ2V0X2RldmljZV9pcChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcyk7CitleHRlcm4gTElCVFlQRSB1aW50MzJfdCBoZGhvbWVydW5fY29udHJvbF9nZXRfZGV2aWNlX2lkX3JlcXVlc3RlZChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcyk7CitleHRlcm4gTElCVFlQRSB1aW50MzJfdCBoZGhvbWVydW5fY29udHJvbF9nZXRfZGV2aWNlX2lwX3JlcXVlc3RlZChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcyk7CisKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2NvbnRyb2xfc2V0X2RldmljZShzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgdWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBkZXZpY2VfaXApOworCisvKgorICogR2V0IHRoZSBsb2NhbCBtYWNoaW5lIElQIGFkZHJlc3MgdXNlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgSVAgYWRkcmVzcyB0byB1c2Ugd2l0aCBzZXQgdGFyZ2V0IGNvbW1hbmRzLgorICoKKyAqIFJldHVybnMgMzItYml0IElQIGFkZHJlc3Mgd2l0aCBuYXRpdmUgZW5kaWFubmVzcywgb3IgMCBvbiBlcnJvci4KKyAqLworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2NvbnRyb2xfZ2V0X2xvY2FsX2FkZHIoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MpOworCisvKgorICogTG93LWxldmVsIGNvbW11bmljYXRpb24uCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fY29udHJvbF9zZW5kX3JlY3Yoc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqY3MsIHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnR4X3BrdCwgc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcnhfcGt0LCB1aW50MTZfdCB0eXBlKTsKKworLyoKKyAqIEdldC9zZXQgYSBjb250cm9sIHZhcmlhYmxlIG9uIHRoZSBkZXZpY2UuCisgKgorICogY29uc3QgY2hhciAqbmFtZTogVGhlIG5hbWUgb2YgdmFyIHRvIGdldC9zZXQgKGMtc3RyaW5nKS4gVGhlIHN1cHBvcnRlZCB2YXJzIGlzIGRldmljZS9maXJtd2FyZSBkZXBlbmRhbnQuCisgKiBjb25zdCBjaGFyICp2YWx1ZTogVGhlIHZhbHVlIHRvIHNldCAoYy1zdHJpbmcpLiBUaGUgZm9ybWF0IGlzIGRldmljZS9maXJtd2FyZSBkZXBlbmRhbnQuCisKKyAqIGNoYXIgKipwdmFsdWU6IElmIHByb3ZpZGVkLCB0aGUgY2FsbGVyLXN1cHBsaWVkIGNoYXIgcG9pbnRlciB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUgdmFsdWUKKyAqCQlzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGRldmljZSwgb3IgTlVMTCBpZiB0aGUgZGV2aWNlIHJldHVybmVkIGFuIGVycm9yIHN0cmluZy4gVGhlIHN0cmluZyB3aWxsIHJlbWFpbgorICoJCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYSBjb250cm9sIHNvY2sgZnVuY3Rpb24uCisgKiBjaGFyICoqcGVycm9yOiBJZiBwcm92aWRlZCwgdGhlIGNhbGxlci1zdXBwbGllZCBjaGFyIHBvaW50ZXIgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGVycm9yCisgKgkJc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBkZXZpY2UsIG9yIE5VTEwgaWYgdGhlIGRldmljZSByZXR1cm5lZCBhbiB2YWx1ZSBzdHJpbmcuIFRoZSBzdHJpbmcgd2lsbCByZW1haW4KKyAqCQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGEgY29udHJvbCBzb2NrIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIChwdmFsdWUgc2V0LCBwZXJyb3IgTlVMTCkuCisgKiBSZXR1cm5zIDAgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgKHB2YWx1ZSBOVUxMLCBwZXJyb3Igc2V0KS4KKyAqIFJldHVybnMgLTEgaWYgYSBjb21tdW5pY2F0aW9uIGVycm9yIG9jY3Vycy4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9jb250cm9sX2dldChzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKnB2YWx1ZSwgY2hhciAqKnBlcnJvcik7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2NvbnRyb2xfc2V0KHN0cnVjdCBoZGhvbWVydW5fY29udHJvbF9zb2NrX3QgKmNzLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgY2hhciAqKnB2YWx1ZSwgY2hhciAqKnBlcnJvcik7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2NvbnRyb2xfc2V0X3dpdGhfbG9ja2tleShzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHVpbnQzMl90IGxvY2trZXksIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpOworCisvKgorICogVXBsb2FkIG5ldyBmaXJtd2FyZSB0byB0aGUgZGV2aWNlLgorICoKKyAqIEZJTEUgKnVwZ3JhZGVfZmlsZTogRmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4gVGhlIGZpbGUgbXVzdCBoYXZlIGJlZW4gb3BlbmVkIGluIGJpbmFyeSBtb2RlIGZvciByZWFkaW5nLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgdXBsb2FkIHN1Y2NlZWRlZC4KKyAqIFJldHVybnMgMCBpZiB0aGUgdXBsb2FkIHdhcyByZWplY3RlZC4KKyAqIFJldHVybnMgLTEgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2NvbnRyb2xfdXBncmFkZShzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjcywgRklMRSAqdXBncmFkZV9maWxlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fZGVidWcuYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Njg2ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZWJ1Zy5jCkBAIC0wLDAgKzEsNDc3IEBACisvKgorICogaGRob21lcnVuX2RlYnVnLmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoZSBkZWJ1ZyBsb2dnaW5nIGluY2x1ZGVzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlCisgKiBTaWxpY29uZHVzdCBzdXBwb3J0IHNlcnZlci4gVGhpcyBvcHRpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGhvdXQKKyAqIGJlaW5nIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB0aGUgdXNlci4gRGVidWcgaW5mb3JtYXRpb24gc2hvdWxkIGJlCisgKiBsaW1pdGVkIHRvIGluZm9ybWF0aW9uIHVzZWZ1bCB0byBkaWFnbm9zaW5nIGEgcHJvYmxlbS4KKyAqICAtIFNpbGljb25kdXN0LgorICovCisKKyNpbmNsdWRlICJoZGhvbWVydW4uaCIKKworI2lmICFkZWZpbmVkKEhESE9NRVJVTl9ERUJVR19IT1NUKQorI2RlZmluZSBIREhPTUVSVU5fREVCVUdfSE9TVCAiZGVidWcuc2lsaWNvbmR1c3QuY29tIgorI2VuZGlmCisjaWYgIWRlZmluZWQoSERIT01FUlVOX0RFQlVHX1BPUlQpCisjZGVmaW5lIEhESE9NRVJVTl9ERUJVR19QT1JUIDgwMDIKKyNlbmRpZgorCisjZGVmaW5lIEhESE9NRVJVTl9ERUJVR19DT05ORUNUX1JFVFJZX1RJTUUgMzAwMDAKKyNkZWZpbmUgSERIT01FUlVOX0RFQlVHX0NPTk5FQ1RfVElNRU9VVCAxMDAwMAorI2RlZmluZSBIREhPTUVSVU5fREVCVUdfU0VORF9USU1FT1VUIDEwMDAwCisKK3N0cnVjdCBoZGhvbWVydW5fZGVidWdfbWVzc2FnZV90Cit7CisJc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QgKm5leHQ7CisJc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QgKnByZXY7CisJY2hhciBidWZmZXJbMjA0OF07Cit9OworCitzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QKK3sKKwlwdGhyZWFkX3QgdGhyZWFkOworCXZvbGF0aWxlIGJvb2xfdCBlbmFibGVkOworCXZvbGF0aWxlIGJvb2xfdCB0ZXJtaW5hdGU7CisJY2hhciAqcHJlZml4OworCisJcHRocmVhZF9tdXRleF90IHByaW50X2xvY2s7CisJcHRocmVhZF9tdXRleF90IHF1ZXVlX2xvY2s7CisJcHRocmVhZF9tdXRleF90IHNlbmRfbG9jazsKKworCXN0cnVjdCBoZGhvbWVydW5fZGVidWdfbWVzc2FnZV90ICpxdWV1ZV9oZWFkOworCXN0cnVjdCBoZGhvbWVydW5fZGVidWdfbWVzc2FnZV90ICpxdWV1ZV90YWlsOworCXVpbnQzMl90IHF1ZXVlX2RlcHRoOworCisJdWludDY0X3QgY29ubmVjdF9kZWxheTsKKworCWNoYXIgKmZpbGVfbmFtZTsKKwlGSUxFICpmaWxlX2ZwOworCWhkaG9tZXJ1bl9zb2NrX3Qgc29jazsKK307CisKK3N0YXRpYyBUSFJFQURfRlVOQ19QUkVGSVggaGRob21lcnVuX2RlYnVnX3RocmVhZF9leGVjdXRlKHZvaWQgKmFyZyk7CisKK3N0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqaGRob21lcnVuX2RlYnVnX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnID0gKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190KSk7CisJaWYgKCFkYmcpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGJnLT5zb2NrID0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmZGJnLT5wcmludF9sb2NrLCBOVUxMKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJmRiZy0+cXVldWVfbG9jaywgTlVMTCk7CisJcHRocmVhZF9tdXRleF9pbml0KCZkYmctPnNlbmRfbG9jaywgTlVMTCk7CisKKwlpZiAocHRocmVhZF9jcmVhdGUoJmRiZy0+dGhyZWFkLCBOVUxMLCAmaGRob21lcnVuX2RlYnVnX3RocmVhZF9leGVjdXRlLCBkYmcpICE9IDApIHsKKwkJZnJlZShkYmcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGJnOworfQorCit2b2lkIGhkaG9tZXJ1bl9kZWJ1Z19kZXN0cm95KHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworCWlmICghZGJnKSB7CisJCXJldHVybjsKKwl9CisKKwlkYmctPnRlcm1pbmF0ZSA9IFRSVUU7CisJcHRocmVhZF9qb2luKGRiZy0+dGhyZWFkLCBOVUxMKTsKKworCWlmIChkYmctPnByZWZpeCkgeworCQlmcmVlKGRiZy0+cHJlZml4KTsKKwl9CisJaWYgKGRiZy0+ZmlsZV9uYW1lKSB7CisJCWZyZWUoZGJnLT5maWxlX25hbWUpOworCX0KKwlpZiAoZGJnLT5maWxlX2ZwKSB7CisJCWZjbG9zZShkYmctPmZpbGVfZnApOworCX0KKwlpZiAoZGJnLT5zb2NrICE9IEhESE9NRVJVTl9TT0NLX0lOVkFMSUQpIHsKKwkJaGRob21lcnVuX3NvY2tfZGVzdHJveShkYmctPnNvY2spOworCX0KKworCWZyZWUoZGJnKTsKK30KKworLyogU2VuZCBsb2NrIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgdm9pZCBoZGhvbWVydW5fZGVidWdfY2xvc2VfaW50ZXJuYWwoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcpCit7CisJaWYgKGRiZy0+ZmlsZV9mcCkgeworCQlmY2xvc2UoZGJnLT5maWxlX2ZwKTsKKwkJZGJnLT5maWxlX2ZwID0gTlVMTDsKKwl9CisKKwlpZiAoZGJnLT5zb2NrICE9IEhESE9NRVJVTl9TT0NLX0lOVkFMSUQpIHsKKwkJaGRob21lcnVuX3NvY2tfZGVzdHJveShkYmctPnNvY2spOworCQlkYmctPnNvY2sgPSBIREhPTUVSVU5fU09DS19JTlZBTElEOworCX0KK30KKwordm9pZCBoZGhvbWVydW5fZGVidWdfY2xvc2Uoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJaWYgKCFkYmcpIHsKKwkJcmV0dXJuOworCX0KKworCWlmICh0aW1lb3V0ID4gMCkgeworCQloZGhvbWVydW5fZGVidWdfZmx1c2goZGJnLCB0aW1lb3V0KTsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmRiZy0+c2VuZF9sb2NrKTsKKwloZGhvbWVydW5fZGVidWdfY2xvc2VfaW50ZXJuYWwoZGJnKTsKKwlkYmctPmNvbm5lY3RfZGVsYXkgPSAwOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYmctPnNlbmRfbG9jayk7Cit9CisKK3ZvaWQgaGRob21lcnVuX2RlYnVnX3NldF9maWxlbmFtZShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaWYgKCFkYmcpIHsKKwkJcmV0dXJuOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZGJnLT5zZW5kX2xvY2spOworCisJaWYgKCFmaWxlbmFtZSAmJiAhZGJnLT5maWxlX25hbWUpIHsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmRiZy0+c2VuZF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZmlsZW5hbWUgJiYgZGJnLT5maWxlX25hbWUpIHsKKwkJaWYgKHN0cmNtcChmaWxlbmFtZSwgZGJnLT5maWxlX25hbWUpID09IDApIHsKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYmctPnNlbmRfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwloZGhvbWVydW5fZGVidWdfY2xvc2VfaW50ZXJuYWwoZGJnKTsKKwlkYmctPmNvbm5lY3RfZGVsYXkgPSAwOworCisJaWYgKGRiZy0+ZmlsZV9uYW1lKSB7CisJCWZyZWUoZGJnLT5maWxlX25hbWUpOworCQlkYmctPmZpbGVfbmFtZSA9IE5VTEw7CisJfQorCWlmIChmaWxlbmFtZSkgeworCQlkYmctPmZpbGVfbmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmRiZy0+c2VuZF9sb2NrKTsKK30KKwordm9pZCBoZGhvbWVydW5fZGVidWdfc2V0X3ByZWZpeChzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZywgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmICghZGJnKSB7CisJCXJldHVybjsKKwl9CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmRiZy0+cHJpbnRfbG9jayk7CisKKwlpZiAoZGJnLT5wcmVmaXgpIHsKKwkJZnJlZShkYmctPnByZWZpeCk7CisJCWRiZy0+cHJlZml4ID0gTlVMTDsKKwl9CisKKwlpZiAocHJlZml4KSB7CisJCWRiZy0+cHJlZml4ID0gc3RyZHVwKHByZWZpeCk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmRiZy0+cHJpbnRfbG9jayk7Cit9CisKK3ZvaWQgaGRob21lcnVuX2RlYnVnX2VuYWJsZShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwlpZiAoIWRiZykgeworCQlyZXR1cm47CisJfQorCisJZGJnLT5lbmFibGVkID0gVFJVRTsKK30KKwordm9pZCBoZGhvbWVydW5fZGVidWdfZGlzYWJsZShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwlpZiAoIWRiZykgeworCQlyZXR1cm47CisJfQorCisJZGJnLT5lbmFibGVkID0gRkFMU0U7Cit9CisKK2Jvb2xfdCBoZGhvbWVydW5fZGVidWdfZW5hYmxlZChzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwlpZiAoIWRiZykgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIGRiZy0+ZW5hYmxlZDsKK30KKwordm9pZCBoZGhvbWVydW5fZGVidWdfZmx1c2goc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJaWYgKCFkYmcpIHsKKwkJcmV0dXJuOworCX0KKworCXRpbWVvdXQgPSBnZXRjdXJyZW50dGltZSgpICsgdGltZW91dDsKKworCXdoaWxlIChnZXRjdXJyZW50dGltZSgpIDwgdGltZW91dCkgeworCQlwdGhyZWFkX211dGV4X2xvY2soJmRiZy0+cXVldWVfbG9jayk7CisJCXN0cnVjdCBoZGhvbWVydW5fZGVidWdfbWVzc2FnZV90ICptZXNzYWdlID0gZGJnLT5xdWV1ZV90YWlsOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGJnLT5xdWV1ZV9sb2NrKTsKKworCQlpZiAoIW1lc3NhZ2UpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCW1zbGVlcF9hcHByb3goMTApOworCX0KK30KKwordm9pZCBoZGhvbWVydW5fZGVidWdfcHJpbnRmKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwloZGhvbWVydW5fZGVidWdfdnByaW50ZihkYmcsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIGhkaG9tZXJ1bl9kZWJ1Z192cHJpbnRmKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwlpZiAoIWRiZykgeworCQlyZXR1cm47CisJfQorCWlmICghZGJnLT5lbmFibGVkKSB7CisJCXJldHVybjsKKwl9CisKKwlzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX21lc3NhZ2VfdCAqbWVzc2FnZSA9IChzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX21lc3NhZ2VfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QpKTsKKwlpZiAoIW1lc3NhZ2UpIHsKKwkJcmV0dXJuOworCX0KKworCWNoYXIgKnB0ciA9IG1lc3NhZ2UtPmJ1ZmZlcjsKKwljaGFyICplbmQgPSBtZXNzYWdlLT5idWZmZXIgKyBzaXplb2YobWVzc2FnZS0+YnVmZmVyKSAtIDI7CisJKmVuZCA9IDA7CisKKwkvKgorCSAqIFRpbWVzdGFtcC4KKwkgKi8KKwl0aW1lX3QgY3VycmVudF90aW1lID0gdGltZShOVUxMKTsKKwlwdHIgKz0gc3RyZnRpbWUocHRyLCBlbmQgLSBwdHIsICIlWSVtJWQtJUg6JU06JVMgIiwgbG9jYWx0aW1lKCZjdXJyZW50X3RpbWUpKTsKKwlpZiAocHRyID4gZW5kKSB7CisJCXB0ciA9IGVuZDsKKwl9CisKKwkvKgorCSAqIERlYnVnIHByZWZpeC4KKwkgKi8KKwlwdGhyZWFkX211dGV4X2xvY2soJmRiZy0+cHJpbnRfbG9jayk7CisKKwlpZiAoZGJnLT5wcmVmaXgpIHsKKwkJaW50IGxlbiA9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAiJXMgIiwgZGJnLT5wcmVmaXgpOworCQlsZW4gPSAobGVuIDw9IDApID8gMCA6IGxlbjsKKwkJcHRyICs9IGxlbjsKKwkJaWYgKHB0ciA+IGVuZCkgeworCQkJcHRyID0gZW5kOworCQl9CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmRiZy0+cHJpbnRfbG9jayk7CisKKwkvKgorCSAqIE1lc3NhZ2UgdGV4dC4KKwkgKi8KKwlpbnQgbGVuID0gdnNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCBmbXQsIGFyZ3MpOworCWxlbiA9IChsZW4gPCAwKSA/IDAgOiBsZW47IC8qIGxlbiBkb2VzIG5vdCBpbmNsdWRlIG51bGwgKi8KKwlwdHIgKz0gbGVuOworCWlmIChwdHIgPiBlbmQpIHsKKwkJcHRyID0gZW5kOworCX0KKworCS8qCisJICogRm9yY2UgbmV3bGluZS4KKwkgKi8KKwlpZiAoKHB0clstMV0gIT0gJ1xuJykgJiYgKHB0ciArIDEgPD0gZW5kKSkgeworCQkqcHRyKysgPSAnXG4nOworCX0KKworCS8qCisJICogRm9yY2UgTlVMTC4KKwkgKi8KKwlpZiAocHRyICsgMSA+IGVuZCkgeworCQlwdHIgPSBlbmQgLSAxOworCX0KKwkqcHRyKysgPSAwOworCisJLyoKKwkgKiBFbnF1ZXVlLgorCSAqLworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZGJnLT5xdWV1ZV9sb2NrKTsKKworCW1lc3NhZ2UtPnByZXYgPSBOVUxMOworCW1lc3NhZ2UtPm5leHQgPSBkYmctPnF1ZXVlX2hlYWQ7CisJZGJnLT5xdWV1ZV9oZWFkID0gbWVzc2FnZTsKKwlpZiAobWVzc2FnZS0+bmV4dCkgeworCQltZXNzYWdlLT5uZXh0LT5wcmV2ID0gbWVzc2FnZTsKKwl9IGVsc2UgeworCQlkYmctPnF1ZXVlX3RhaWwgPSBtZXNzYWdlOworCX0KKwlkYmctPnF1ZXVlX2RlcHRoKys7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZGJnLT5xdWV1ZV9sb2NrKTsKK30KKworLyogU2VuZCBsb2NrIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgYm9vbF90IGhkaG9tZXJ1bl9kZWJ1Z19vdXRwdXRfbWVzc2FnZV9maWxlKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX21lc3NhZ2VfdCAqbWVzc2FnZSkKK3sKKwlpZiAoIWRiZy0+ZmlsZV9mcCkgeworCQl1aW50NjRfdCBjdXJyZW50X3RpbWUgPSBnZXRjdXJyZW50dGltZSgpOworCQlpZiAoY3VycmVudF90aW1lIDwgZGJnLT5jb25uZWN0X2RlbGF5KSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJZGJnLT5jb25uZWN0X2RlbGF5ID0gY3VycmVudF90aW1lICsgMzAqMTAwMDsKKworCQlkYmctPmZpbGVfZnAgPSBmb3BlbihkYmctPmZpbGVfbmFtZSwgImEiKTsKKwkJaWYgKCFkYmctPmZpbGVfZnApIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCWZwcmludGYoZGJnLT5maWxlX2ZwLCAiJXMiLCBtZXNzYWdlLT5idWZmZXIpOworCWZmbHVzaChkYmctPmZpbGVfZnApOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIFNlbmQgbG9jayBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fZGVidWdfb3V0cHV0X21lc3NhZ2Vfc29jayhzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZywgc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QgKm1lc3NhZ2UpCit7CisJaWYgKGRiZy0+c29jayA9PSBIREhPTUVSVU5fU09DS19JTlZBTElEKSB7CisJCXVpbnQ2NF90IGN1cnJlbnRfdGltZSA9IGdldGN1cnJlbnR0aW1lKCk7CisJCWlmIChjdXJyZW50X3RpbWUgPCBkYmctPmNvbm5lY3RfZGVsYXkpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlkYmctPmNvbm5lY3RfZGVsYXkgPSBjdXJyZW50X3RpbWUgKyBIREhPTUVSVU5fREVCVUdfQ09OTkVDVF9SRVRSWV9USU1FOworCisJCWRiZy0+c29jayA9IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV90Y3AoKTsKKwkJaWYgKGRiZy0+c29jayA9PSBIREhPTUVSVU5fU09DS19JTlZBTElEKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQl1aW50MzJfdCByZW1vdGVfYWRkciA9IGhkaG9tZXJ1bl9zb2NrX2dldGFkZHJpbmZvX2FkZHIoZGJnLT5zb2NrLCBIREhPTUVSVU5fREVCVUdfSE9TVCk7CisJCWlmIChyZW1vdGVfYWRkciA9PSAwKSB7CisJCQloZGhvbWVydW5fZGVidWdfY2xvc2VfaW50ZXJuYWwoZGJnKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCWlmICghaGRob21lcnVuX3NvY2tfY29ubmVjdChkYmctPnNvY2ssIHJlbW90ZV9hZGRyLCBIREhPTUVSVU5fREVCVUdfUE9SVCwgSERIT01FUlVOX0RFQlVHX0NPTk5FQ1RfVElNRU9VVCkpIHsKKwkJCWhkaG9tZXJ1bl9kZWJ1Z19jbG9zZV9pbnRlcm5hbChkYmcpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihtZXNzYWdlLT5idWZmZXIpOworCWlmICghaGRob21lcnVuX3NvY2tfc2VuZChkYmctPnNvY2ssIG1lc3NhZ2UtPmJ1ZmZlciwgbGVuZ3RoLCBIREhPTUVSVU5fREVCVUdfU0VORF9USU1FT1VUKSkgeworCQloZGhvbWVydW5fZGVidWdfY2xvc2VfaW50ZXJuYWwoZGJnKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgYm9vbF90IGhkaG9tZXJ1bl9kZWJ1Z19vdXRwdXRfbWVzc2FnZShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZywgc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QgKm1lc3NhZ2UpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZkYmctPnNlbmRfbG9jayk7CisKKwlib29sX3QgcmV0OworCWlmIChkYmctPmZpbGVfbmFtZSkgeworCQlyZXQgPSBoZGhvbWVydW5fZGVidWdfb3V0cHV0X21lc3NhZ2VfZmlsZShkYmcsIG1lc3NhZ2UpOworCX0gZWxzZSB7CisJCXJldCA9IGhkaG9tZXJ1bl9kZWJ1Z19vdXRwdXRfbWVzc2FnZV9zb2NrKGRiZywgbWVzc2FnZSk7CisJfQorCisJcHRocmVhZF9tdXRleF91bmxvY2soJmRiZy0+c2VuZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoZGhvbWVydW5fZGVidWdfcG9wX2FuZF9mcmVlX21lc3NhZ2Uoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZkYmctPnF1ZXVlX2xvY2spOworCisJc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z19tZXNzYWdlX3QgKm1lc3NhZ2UgPSBkYmctPnF1ZXVlX3RhaWw7CisJZGJnLT5xdWV1ZV90YWlsID0gbWVzc2FnZS0+cHJldjsKKwlpZiAobWVzc2FnZS0+cHJldikgeworCQltZXNzYWdlLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlkYmctPnF1ZXVlX2hlYWQgPSBOVUxMOworCX0KKwlkYmctPnF1ZXVlX2RlcHRoLS07CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmZGJnLT5xdWV1ZV9sb2NrKTsKKworCWZyZWUobWVzc2FnZSk7Cit9CisKK3N0YXRpYyBUSFJFQURfRlVOQ19QUkVGSVggaGRob21lcnVuX2RlYnVnX3RocmVhZF9leGVjdXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyA9IChzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKilhcmc7CisKKwl3aGlsZSAoIWRiZy0+dGVybWluYXRlKSB7CisKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZkYmctPnF1ZXVlX2xvY2spOworCQlzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX21lc3NhZ2VfdCAqbWVzc2FnZSA9IGRiZy0+cXVldWVfdGFpbDsKKwkJdWludDMyX3QgcXVldWVfZGVwdGggPSBkYmctPnF1ZXVlX2RlcHRoOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmZGJnLT5xdWV1ZV9sb2NrKTsKKworCQlpZiAoIW1lc3NhZ2UpIHsKKwkJCW1zbGVlcF9hcHByb3goMjUwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHF1ZXVlX2RlcHRoID4gMTAyNCkgeworCQkJaGRob21lcnVuX2RlYnVnX3BvcF9hbmRfZnJlZV9tZXNzYWdlKGRiZyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghaGRob21lcnVuX2RlYnVnX291dHB1dF9tZXNzYWdlKGRiZywgbWVzc2FnZSkpIHsKKwkJCW1zbGVlcF9hcHByb3goMjUwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGRob21lcnVuX2RlYnVnX3BvcF9hbmRfZnJlZV9tZXNzYWdlKGRiZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2RlYnVnLmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzc4MzFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fZGVidWcuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogaGRob21lcnVuX2RlYnVnLmgKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgZGVidWcgbG9nZ2luZyBpbmNsdWRlcyBvcHRpb25hbCBzdXBwb3J0IGZvciBjb25uZWN0aW5nIHRvIHRoZQorICogU2lsaWNvbmR1c3Qgc3VwcG9ydCBzZXJ2ZXIuIFRoaXMgb3B0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB3aXRob3V0CisgKiBiZWluZyBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdGhlIHVzZXIuIERlYnVnIGluZm9ybWF0aW9uIHNob3VsZCBiZQorICogbGltaXRlZCB0byBpbmZvcm1hdGlvbiB1c2VmdWwgdG8gZGlhZ25vc2luZyBhIHByb2JsZW0uCisgKiAgLSBTaWxpY29uZHVzdC4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBoZGhvbWVydW5fZGVidWdfdDsKKworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpoZGhvbWVydW5fZGVidWdfY3JlYXRlKHZvaWQpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGVidWdfZGVzdHJveShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CisKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2RlYnVnX3NldF9wcmVmaXgoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZWJ1Z19zZXRfZmlsZW5hbWUoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2RlYnVnX2VuYWJsZShzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZWJ1Z19kaXNhYmxlKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKTsKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fZGVidWdfZW5hYmxlZChzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CisKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2RlYnVnX2ZsdXNoKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCB1aW50NjRfdCB0aW1lb3V0KTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2RlYnVnX2Nsb3NlKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCB1aW50NjRfdCB0aW1lb3V0KTsKKworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGVidWdfcHJpbnRmKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZWJ1Z192cHJpbnRmKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2RldmljZS5jIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTljMDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2UuYwpAQCAtMCwwICsxLDE0MDcgQEAKKy8qCisgKiBoZGhvbWVydW5fZGV2aWNlLmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImhkaG9tZXJ1bi5oIgorCitzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90IHsKKwlzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpjczsKKwlzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnM7CisJc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmc7CisJc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl90ICpzY2FuOworCXVpbnQzMl90IG11bHRpY2FzdF9pcDsKKwl1aW50MTZfdCBtdWx0aWNhc3RfcG9ydDsKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IHR1bmVyOworCXVpbnQzMl90IGxvY2trZXk7CisJY2hhciBuYW1lWzMyXTsKKwljaGFyIG1vZGVsWzMyXTsKK307CisKK3N0YXRpYyBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfZGV2aWNlX25vcm1hbChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgdWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBkZXZpY2VfaXApCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGQtPmNzID0gaGRob21lcnVuX2NvbnRyb2xfY3JlYXRlKDAsIDAsIGhkLT5kYmcpOworCQlpZiAoIWhkLT5jcykgeworCQkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfZGV2aWNlOiBmYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wgb2JqZWN0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWhkaG9tZXJ1bl9jb250cm9sX3NldF9kZXZpY2UoaGQtPmNzLCBkZXZpY2VfaWQsIGRldmljZV9pcCk7CisKKwlpZiAoKGRldmljZV9pZCA9PSAwKSB8fCAoZGV2aWNlX2lkID09IEhESE9NRVJVTl9ERVZJQ0VfSURfV0lMRENBUkQpKSB7CisJCWRldmljZV9pZCA9IGhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaWQoaGQtPmNzKTsKKwl9CisKKwloZC0+bXVsdGljYXN0X2lwID0gMDsKKwloZC0+bXVsdGljYXN0X3BvcnQgPSAwOworCWhkLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisJaGQtPnR1bmVyID0gMDsKKwloZC0+bG9ja2tleSA9IDA7CisKKwlzcHJpbnRmKGhkLT5uYW1lLCAiJTA4bFgtJXUiLCAodW5zaWduZWQgbG9uZyloZC0+ZGV2aWNlX2lkLCBoZC0+dHVuZXIpOworCWhkLT5tb2RlbFswXSA9IDA7IC8qIGNsZWFyIGNhY2hlZCBtb2RlbCBzdHJpbmcgKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZV9tdWx0aWNhc3Qoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIHVpbnQzMl90IG11bHRpY2FzdF9pcCkKK3sKKwlpZiAoaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9jb250cm9sX2Rlc3Ryb3koaGQtPmNzKTsKKwkJaGQtPmNzID0gTlVMTDsKKwl9CisKKwloZC0+bXVsdGljYXN0X2lwID0gbXVsdGljYXN0X2lwOworCWhkLT5tdWx0aWNhc3RfcG9ydCA9IDA7CisJaGQtPmRldmljZV9pZCA9IDA7CisJaGQtPnR1bmVyID0gMDsKKwloZC0+bG9ja2tleSA9IDA7CisKKwl1bnNpZ25lZCBsb25nIGlwID0gbXVsdGljYXN0X2lwOworCXNwcmludGYoaGQtPm5hbWUsICIlbHUuJWx1LiVsdS4lbHUiLCAoaXAgPj4gMjQpICYgMHhGRiwgKGlwID4+IDE2KSAmIDB4RkYsIChpcCA+PiA4KSAmIDB4RkYsIChpcCA+PiAwKSAmIDB4RkYpOworCXNwcmludGYoaGQtPm1vZGVsLCAibXVsdGljYXN0Iik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgdWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBkZXZpY2VfaXApCit7CisJaWYgKChkZXZpY2VfaWQgPT0gMCkgJiYgKGRldmljZV9pcCA9PSAwKSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NldF9kZXZpY2U6IGRldmljZSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZGhvbWVydW5fZGlzY292ZXJfaXNfaXBfbXVsdGljYXN0KGRldmljZV9pcCkpIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZV9tdWx0aWNhc3QoaGQsIGRldmljZV9pcCk7CisJfQorCisJcmV0dXJuIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZV9ub3JtYWwoaGQsIGRldmljZV9pZCwgZGV2aWNlX2lwKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCB1bnNpZ25lZCBpbnQgdHVuZXIpCit7CisJaWYgKGhkLT5tdWx0aWNhc3RfaXAgIT0gMCkgeworCQlpZiAodHVuZXIgIT0gMCkgeworCQkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXI6IHR1bmVyIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gbXVsdGljYXN0IG1vZGVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJaGQtPnR1bmVyID0gdHVuZXI7CisJc3ByaW50ZihoZC0+bmFtZSwgIiUwOGxYLSV1IiwgKHVuc2lnbmVkIGxvbmcpaGQtPmRldmljZV9pZCwgaGQtPnR1bmVyKTsKKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZSh1aW50MzJfdCBkZXZpY2VfaWQsIHVpbnQzMl90IGRldmljZV9pcCwgdW5zaWduZWQgaW50IHR1bmVyLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCA9IChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90KSk7CisJaWYgKCFoZCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGRiZywgImhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlOiBmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIG9iamVjdFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWhkLT5kYmcgPSBkYmc7CisKKwlpZiAoKGRldmljZV9pZCA9PSAwKSAmJiAoZGV2aWNlX2lwID09IDApICYmICh0dW5lciA9PSAwKSkgeworCQlyZXR1cm4gaGQ7CisJfQorCisJaWYgKGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZShoZCwgZGV2aWNlX2lkLCBkZXZpY2VfaXApIDw9IDApIHsKKwkJZnJlZShoZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXIoaGQsIHR1bmVyKSA8PSAwKSB7CisJCWZyZWUoaGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaGQ7Cit9CisKK3ZvaWQgaGRob21lcnVuX2RldmljZV9kZXN0cm95KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmIChoZC0+c2NhbikgeworCQljaGFubmVsc2Nhbl9kZXN0cm95KGhkLT5zY2FuKTsKKwl9CisKKwlpZiAoaGQtPnZzKSB7CisJCWhkaG9tZXJ1bl92aWRlb19kZXN0cm95KGhkLT52cyk7CisJfQorCisJaWYgKGhkLT5jcykgeworCQloZGhvbWVydW5fY29udHJvbF9kZXN0cm95KGhkLT5jcyk7CisJfQorCisJZnJlZShoZCk7Cit9CisKK3N0YXRpYyBib29sX3QgaXNfaGV4X2NoYXIoY2hhciBjKQoreworCWlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICgoYyA+PSAnQScpICYmIChjIDw9ICdGJykpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICgoYyA+PSAnYScpICYmIChjIDw9ICdmJykpIHsKKwkJcmV0dXJuIFRSVUU7CisJfQorCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyX2RldmljZV9pZChjb25zdCBjaGFyICpkZXZpY2Vfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpwdHIgPSBkZXZpY2Vfc3RyOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKCFpc19oZXhfY2hhcigqcHRyKyspKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmICgqcHRyID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBkZXZpY2VfaWQ7CisJCWlmIChzc2NhbmYoZGV2aWNlX3N0ciwgIiVseCIsICZkZXZpY2VfaWQpICE9IDEpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZSgodWludDMyX3QpZGV2aWNlX2lkLCAwLCAwLCBkYmcpOworCX0KKworCWlmICgqcHRyID09ICctJykgeworCQl1bnNpZ25lZCBsb25nIGRldmljZV9pZDsKKwkJdW5zaWduZWQgaW50IHR1bmVyOworCQlpZiAoc3NjYW5mKGRldmljZV9zdHIsICIlbHgtJXUiLCAmZGV2aWNlX2lkLCAmdHVuZXIpICE9IDIpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJldHVybiBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZSgodWludDMyX3QpZGV2aWNlX2lkLCAwLCB0dW5lciwgZGJnKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyX2lwX3Jlc3VsdCh1bnNpZ25lZCBsb25nIGFbNF0sIHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgdHVuZXIsIHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2lwID0gKGFbMF0gPDwgMjQpIHwgKGFbMV0gPDwgMTYpIHwgKGFbMl0gPDwgOCkgfCAoYVszXSA8PCAwKTsKKwlzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCA9IGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlKEhESE9NRVJVTl9ERVZJQ0VfSURfV0lMRENBUkQsICh1aW50MzJfdClkZXZpY2VfaXAsIHR1bmVyLCBkYmcpOworCWlmICghaGQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGhkLT5tdWx0aWNhc3RfaXAgIT0gMCkgeworCQloZC0+bXVsdGljYXN0X3BvcnQgPSAodWludDE2X3QpcG9ydDsKKwl9CisKKwlyZXR1cm4gaGQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZV9mcm9tX3N0cl9pcChjb25zdCBjaGFyICpkZXZpY2Vfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZykKK3sKKwl1bnNpZ25lZCBsb25nIGFbNF07CisJdW5zaWduZWQgaW50IHBvcnQgPSAwOworCXVuc2lnbmVkIGludCB0dW5lciA9IDA7CisKKwlpZiAoc3NjYW5mKGRldmljZV9zdHIsICIlbHUuJWx1LiVsdS4lbHU6JXUiLCAmYVswXSwgJmFbMV0sICZhWzJdLCAmYVszXSwgJnBvcnQpID09IDUpIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyX2lwX3Jlc3VsdChhLCBwb3J0LCB0dW5lciwgZGJnKTsKKwl9CisJaWYgKHNzY2FuZihkZXZpY2Vfc3RyLCAiJWx1LiVsdS4lbHUuJWx1LSV1IiwgJmFbMF0sICZhWzFdLCAmYVsyXSwgJmFbM10sICZ0dW5lcikgPT0gNSkgeworCQlyZXR1cm4gaGRob21lcnVuX2RldmljZV9jcmVhdGVfZnJvbV9zdHJfaXBfcmVzdWx0KGEsIHBvcnQsIHR1bmVyLCBkYmcpOworCX0KKwlpZiAoc3NjYW5mKGRldmljZV9zdHIsICIlbHUuJWx1LiVsdS4lbHUiLCAmYVswXSwgJmFbMV0sICZhWzJdLCAmYVszXSkgPT0gNCkgeworCQlyZXR1cm4gaGRob21lcnVuX2RldmljZV9jcmVhdGVfZnJvbV9zdHJfaXBfcmVzdWx0KGEsIHBvcnQsIHR1bmVyLCBkYmcpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGRob21lcnVuX2RldmljZV9jcmVhdGVfZnJvbV9zdHJfZG5zKGNvbnN0IGNoYXIgKmRldmljZV9zdHIsIHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKwlyZXR1cm4gTlVMTDsKKyNlbHNlCisJc3RydWN0IGFkZHJpbmZvIGhpbnRzOworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworCisJc3RydWN0IGFkZHJpbmZvICpzb2NrX2luZm87CisJaWYgKGdldGFkZHJpbmZvKGRldmljZV9zdHIsICI2NTAwMSIsICZoaW50cywgJnNvY2tfaW5mbykgIT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNvY2tfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzb2NrX2luZm8tPmFpX2FkZHI7CisJdWludDMyX3QgZGV2aWNlX2lwID0gbnRvaGwoc29ja19hZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCWZyZWVhZGRyaW5mbyhzb2NrX2luZm8pOworCisJaWYgKGRldmljZV9pcCA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZShIREhPTUVSVU5fREVWSUNFX0lEX1dJTERDQVJELCAodWludDMyX3QpZGV2aWNlX2lwLCAwLCBkYmcpOworI2VuZGlmCit9CisKK3N0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyKGNvbnN0IGNoYXIgKmRldmljZV9zdHIsIHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmRldmljZSA9IGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyX2RldmljZV9pZChkZXZpY2Vfc3RyLCBkYmcpOworCWlmIChkZXZpY2UpIHsKKwkJcmV0dXJuIGRldmljZTsKKwl9CisKKwlkZXZpY2UgPSBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZV9mcm9tX3N0cl9pcChkZXZpY2Vfc3RyLCBkYmcpOworCWlmIChkZXZpY2UpIHsKKwkJcmV0dXJuIGRldmljZTsKKwl9CisKKwlkZXZpY2UgPSBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZV9mcm9tX3N0cl9kbnMoZGV2aWNlX3N0ciwgZGJnKTsKKwlpZiAoZGV2aWNlKSB7CisJCXJldHVybiBkZXZpY2U7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9mcm9tX3N0cihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqdHVuZXJfc3RyKQoreworCXVuc2lnbmVkIGludCB0dW5lcjsKKwlpZiAoc3NjYW5mKHR1bmVyX3N0ciwgIiV1IiwgJnR1bmVyKSA9PSAxKSB7CisJCWhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyKGhkLCB0dW5lcik7CisJCXJldHVybiAxOworCX0KKwlpZiAoc3NjYW5mKHR1bmVyX3N0ciwgIi90dW5lciV1IiwgJnR1bmVyKSA9PSAxKSB7CisJCWhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyKGhkLCB0dW5lcik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAtMTsKK30KKworY29uc3QgY2hhciAqaGRob21lcnVuX2RldmljZV9nZXRfbmFtZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlyZXR1cm4gaGQtPm5hbWU7Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2RldmljZV9pZChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlyZXR1cm4gaGQtPmRldmljZV9pZDsKK30KKwordWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfZGV2aWNlX2lwKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmIChoZC0+bXVsdGljYXN0X2lwICE9IDApIHsKKwkJcmV0dXJuIGhkLT5tdWx0aWNhc3RfaXA7CisJfQorCWlmIChoZC0+Y3MpIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaXAoaGQtPmNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfZGV2aWNlX2lkX3JlcXVlc3RlZChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlpZiAoaGQtPm11bHRpY2FzdF9pcCAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaGQtPmNzKSB7CisJCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9nZXRfZGV2aWNlX2lkX3JlcXVlc3RlZChoZC0+Y3MpOworCX0KKworCXJldHVybiAwOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fZGV2aWNlX2dldF9kZXZpY2VfaXBfcmVxdWVzdGVkKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmIChoZC0+bXVsdGljYXN0X2lwICE9IDApIHsKKwkJcmV0dXJuIGhkLT5tdWx0aWNhc3RfaXA7CisJfQorCWlmIChoZC0+Y3MpIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldF9kZXZpY2VfaXBfcmVxdWVzdGVkKGhkLT5jcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlyZXR1cm4gaGQtPnR1bmVyOworfQorCitzdHJ1Y3QgaGRob21lcnVuX2NvbnRyb2xfc29ja190ICpoZGhvbWVydW5fZGV2aWNlX2dldF9jb250cm9sX3NvY2soc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJcmV0dXJuIGhkLT5jczsKK30KKworc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKmhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3ZpZGVvX3NvY2soc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJaWYgKGhkLT52cykgeworCQlyZXR1cm4gaGQtPnZzOworCX0KKworCWJvb2xfdCBhbGxvd19wb3J0X3JldXNlID0gKGhkLT5tdWx0aWNhc3RfcG9ydCAhPSAwKTsKKworCWhkLT52cyA9IGhkaG9tZXJ1bl92aWRlb19jcmVhdGUoaGQtPm11bHRpY2FzdF9wb3J0LCBhbGxvd19wb3J0X3JldXNlLCBWSURFT19EQVRBX0JVRkZFUl9TSVpFXzFTICogMiwgaGQtPmRiZyk7CisJaWYgKCFoZC0+dnMpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfdmlkZW9fc29jazogZmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBvYmplY3RcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaGQtPnZzOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fZGV2aWNlX2dldF9sb2NhbF9tYWNoaW5lX2FkZHIoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJaWYgKGhkLT5jcykgeworCQlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0X2xvY2FsX2FkZHIoaGQtPmNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3N0YXR1c19wYXJzZShjb25zdCBjaGFyICpzdGF0dXNfc3RyLCBjb25zdCBjaGFyICp0YWcpCit7CisJY29uc3QgY2hhciAqcHRyID0gc3Ryc3RyKHN0YXR1c19zdHIsIHRhZyk7CisJaWYgKCFwdHIpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisJc3NjYW5mKHB0ciArIHN0cmxlbih0YWcpLCAiJWx1IiwgJnZhbHVlKTsKKworCXJldHVybiAodWludDMyX3QpdmFsdWU7Cit9CisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RhdHVzX2xvY2tfaXNfYmNhc3Qoc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCAqc3RhdHVzKQoreworCWlmIChzdHJjbXAoc3RhdHVzLT5sb2NrX3N0ciwgIjh2c2IiKSA9PSAwKSB7CisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoc3RybmNtcChzdGF0dXMtPmxvY2tfc3RyLCAidDgiLCAyKSA9PSAwKSB7CisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoc3RybmNtcChzdGF0dXMtPmxvY2tfc3RyLCAidDciLCAyKSA9PSAwKSB7CisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoc3RybmNtcChzdGF0dXMtPmxvY2tfc3RyLCAidDYiLCAyKSA9PSAwKSB7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKwordWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RhdHVzX3NzX2NvbG9yKHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgc3NfeWVsbG93X21pbjsKKwl1bnNpZ25lZCBpbnQgc3NfZ3JlZW5fbWluOworCisJaWYgKCFzdGF0dXMtPmxvY2tfc3VwcG9ydGVkKSB7CisJCXJldHVybiBIREhPTUVSVU5fU1RBVFVTX0NPTE9SX05FVVRSQUw7CisJfQorCisJaWYgKGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1c19sb2NrX2lzX2JjYXN0KHN0YXR1cykpIHsKKwkJc3NfeWVsbG93X21pbiA9IDUwOwkvKiAtMzBkQm1WICovCisJCXNzX2dyZWVuX21pbiA9IDc1OwkvKiAtMTVkQm1WICovCisJfSBlbHNlIHsKKwkJc3NfeWVsbG93X21pbiA9IDgwOwkvKiAtMTJkQm1WICovCisJCXNzX2dyZWVuX21pbiA9IDkwOwkvKiAtNmRCbVYgKi8KKwl9CisKKwlpZiAoc3RhdHVzLT5zaWduYWxfc3RyZW5ndGggPj0gc3NfZ3JlZW5fbWluKSB7CisJCXJldHVybiBIREhPTUVSVU5fU1RBVFVTX0NPTE9SX0dSRUVOOworCX0KKwlpZiAoc3RhdHVzLT5zaWduYWxfc3RyZW5ndGggPj0gc3NfeWVsbG93X21pbikgeworCQlyZXR1cm4gSERIT01FUlVOX1NUQVRVU19DT0xPUl9ZRUxMT1c7CisJfQorCisJcmV0dXJuIEhESE9NRVJVTl9TVEFUVVNfQ09MT1JfUkVEOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9zdGF0dXNfc25xX2NvbG9yKHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlpZiAoc3RhdHVzLT5zaWduYWxfdG9fbm9pc2VfcXVhbGl0eSA+PSA3MCkgeworCQlyZXR1cm4gSERIT01FUlVOX1NUQVRVU19DT0xPUl9HUkVFTjsKKwl9CisJaWYgKHN0YXR1cy0+c2lnbmFsX3RvX25vaXNlX3F1YWxpdHkgPj0gNTApIHsKKwkJcmV0dXJuIEhESE9NRVJVTl9TVEFUVVNfQ09MT1JfWUVMTE9XOworCX0KKworCXJldHVybiBIREhPTUVSVU5fU1RBVFVTX0NPTE9SX1JFRDsKK30KKwordWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RhdHVzX3NlcV9jb2xvcihzdHJ1Y3QgaGRob21lcnVuX3R1bmVyX3N0YXR1c190ICpzdGF0dXMpCit7CisJaWYgKHN0YXR1cy0+c3ltYm9sX2Vycm9yX3F1YWxpdHkgPj0gMTAwKSB7CisJCXJldHVybiBIREhPTUVSVU5fU1RBVFVTX0NPTE9SX0dSRUVOOworCX0KKworCXJldHVybiBIREhPTUVSVU5fU1RBVFVTX0NPTE9SX1JFRDsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1cyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBzdGF0dXNfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX3R1bmVyX3N0YXR1c190ICpzdGF0dXMpCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RhdHVzOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCkpOworCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9zdGF0dXMiLCBoZC0+dHVuZXIpOworCisJY2hhciAqc3RhdHVzX3N0cjsKKwlpbnQgcmV0ID0gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgJnN0YXR1c19zdHIsIE5VTEwpOworCWlmIChyZXQgPD0gMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwc3RhdHVzX3N0cikgeworCQkqcHN0YXR1c19zdHIgPSBzdGF0dXNfc3RyOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJY2hhciAqY2hhbm5lbCA9IHN0cnN0cihzdGF0dXNfc3RyLCAiY2g9Iik7CisJCWlmIChjaGFubmVsKSB7CisJCQlzc2NhbmYoY2hhbm5lbCArIDMsICIlMzFzIiwgc3RhdHVzLT5jaGFubmVsKTsKKwkJfQorCisJCWNoYXIgKmxvY2sgPSBzdHJzdHIoc3RhdHVzX3N0ciwgImxvY2s9Iik7CisJCWlmIChsb2NrKSB7CisJCQlzc2NhbmYobG9jayArIDUsICIlMzFzIiwgc3RhdHVzLT5sb2NrX3N0cik7CisJCX0KKworCQlzdGF0dXMtPnNpZ25hbF9zdHJlbmd0aCA9ICh1bnNpZ25lZCBpbnQpaGRob21lcnVuX2RldmljZV9nZXRfc3RhdHVzX3BhcnNlKHN0YXR1c19zdHIsICJzcz0iKTsKKwkJc3RhdHVzLT5zaWduYWxfdG9fbm9pc2VfcXVhbGl0eSA9ICh1bnNpZ25lZCBpbnQpaGRob21lcnVuX2RldmljZV9nZXRfc3RhdHVzX3BhcnNlKHN0YXR1c19zdHIsICJzbnE9Iik7CisJCXN0YXR1cy0+c3ltYm9sX2Vycm9yX3F1YWxpdHkgPSAodW5zaWduZWQgaW50KWhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3N0YXR1c19wYXJzZShzdGF0dXNfc3RyLCAic2VxPSIpOworCQlzdGF0dXMtPnJhd19iaXRzX3Blcl9zZWNvbmQgPSBoZGhvbWVydW5fZGV2aWNlX2dldF9zdGF0dXNfcGFyc2Uoc3RhdHVzX3N0ciwgImJwcz0iKTsKKwkJc3RhdHVzLT5wYWNrZXRzX3Blcl9zZWNvbmQgPSBoZGhvbWVydW5fZGV2aWNlX2dldF9zdGF0dXNfcGFyc2Uoc3RhdHVzX3N0ciwgInBwcz0iKTsKKworCQlzdGF0dXMtPnNpZ25hbF9wcmVzZW50ID0gc3RhdHVzLT5zaWduYWxfc3RyZW5ndGggPj0gNDU7CisKKwkJaWYgKHN0cmNtcChzdGF0dXMtPmxvY2tfc3RyLCAibm9uZSIpICE9IDApIHsKKwkJCWlmIChzdGF0dXMtPmxvY2tfc3RyWzBdID09ICcoJykgeworCQkJCXN0YXR1cy0+bG9ja191bnN1cHBvcnRlZCA9IFRSVUU7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cy0+bG9ja19zdXBwb3J0ZWQgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF9vb2Jfc3RhdHVzKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHN0YXR1c19zdHIsIHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF9vb2Jfc3RhdHVzOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCkpOworCisJY2hhciAqc3RhdHVzX3N0cjsKKwlpbnQgcmV0ID0gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgIi9vb2Ivc3RhdHVzIiwgJnN0YXR1c19zdHIsIE5VTEwpOworCWlmIChyZXQgPD0gMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwc3RhdHVzX3N0cikgeworCQkqcHN0YXR1c19zdHIgPSBzdGF0dXNfc3RyOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJY2hhciAqY2hhbm5lbCA9IHN0cnN0cihzdGF0dXNfc3RyLCAiY2g9Iik7CisJCWlmIChjaGFubmVsKSB7CisJCQlzc2NhbmYoY2hhbm5lbCArIDMsICIlMzFzIiwgc3RhdHVzLT5jaGFubmVsKTsKKwkJfQorCisJCWNoYXIgKmxvY2sgPSBzdHJzdHIoc3RhdHVzX3N0ciwgImxvY2s9Iik7CisJCWlmIChsb2NrKSB7CisJCQlzc2NhbmYobG9jayArIDUsICIlMzFzIiwgc3RhdHVzLT5sb2NrX3N0cik7CisJCX0KKworCQlzdGF0dXMtPnNpZ25hbF9zdHJlbmd0aCA9ICh1bnNpZ25lZCBpbnQpaGRob21lcnVuX2RldmljZV9nZXRfc3RhdHVzX3BhcnNlKHN0YXR1c19zdHIsICJzcz0iKTsKKwkJc3RhdHVzLT5zaWduYWxfdG9fbm9pc2VfcXVhbGl0eSA9ICh1bnNpZ25lZCBpbnQpaGRob21lcnVuX2RldmljZV9nZXRfc3RhdHVzX3BhcnNlKHN0YXR1c19zdHIsICJzbnE9Iik7CisJCXN0YXR1cy0+c2lnbmFsX3ByZXNlbnQgPSBzdGF0dXMtPnNpZ25hbF9zdHJlbmd0aCA+PSA0NTsKKwkJc3RhdHVzLT5sb2NrX3N1cHBvcnRlZCA9IChzdHJjbXAoc3RhdHVzLT5sb2NrX3N0ciwgIm5vbmUiKSAhPSAwKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3ZzdGF0dXMoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwdnN0YXR1c19zdHIsIHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfdnN0YXR1c190ICp2c3RhdHVzKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3ZzdGF0dXM6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCh2c3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl90dW5lcl92c3RhdHVzX3QpKTsKKworCWNoYXIgdmFyX25hbWVbMzJdOworCXNwcmludGYodmFyX25hbWUsICIvdHVuZXIldS92c3RhdHVzIiwgaGQtPnR1bmVyKTsKKworCWNoYXIgKnZzdGF0dXNfc3RyOworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCB2YXJfbmFtZSwgJnZzdGF0dXNfc3RyLCBOVUxMKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocHZzdGF0dXNfc3RyKSB7CisJCSpwdnN0YXR1c19zdHIgPSB2c3RhdHVzX3N0cjsKKwl9CisKKwlpZiAodnN0YXR1cykgeworCQljaGFyICp2Y2ggPSBzdHJzdHIodnN0YXR1c19zdHIsICJ2Y2g9Iik7CisJCWlmICh2Y2gpIHsKKwkJCXNzY2FuZih2Y2ggKyA0LCAiJTMxcyIsIHZzdGF0dXMtPnZjaGFubmVsKTsKKwkJfQorCisJCWNoYXIgKm5hbWUgPSBzdHJzdHIodnN0YXR1c19zdHIsICJuYW1lPSIpOworCQlpZiAobmFtZSkgeworCQkJc3NjYW5mKG5hbWUgKyA1LCAiJTMxcyIsIHZzdGF0dXMtPm5hbWUpOworCQl9CisKKwkJY2hhciAqYXV0aCA9IHN0cnN0cih2c3RhdHVzX3N0ciwgImF1dGg9Iik7CisJCWlmIChhdXRoKSB7CisJCQlzc2NhbmYoYXV0aCArIDUsICIlMzFzIiwgdnN0YXR1cy0+YXV0aCk7CisJCX0KKworCQljaGFyICpjY2kgPSBzdHJzdHIodnN0YXR1c19zdHIsICJjY2k9Iik7CisJCWlmIChjY2kpIHsKKwkJCXNzY2FuZihjY2kgKyA0LCAiJTMxcyIsIHZzdGF0dXMtPmNjaSk7CisJCX0KKworCQljaGFyICpjZ21zID0gc3Ryc3RyKHZzdGF0dXNfc3RyLCAiY2dtcz0iKTsKKwkJaWYgKGNnbXMpIHsKKwkJCXNzY2FuZihjZ21zICsgNSwgIiUzMXMiLCB2c3RhdHVzLT5jZ21zKTsKKwkJfQorCisJCWlmIChzdHJuY21wKHZzdGF0dXMtPmF1dGgsICJub3Qtc3Vic2NyaWJlZCIsIDE0KSA9PSAwKSB7CisJCQl2c3RhdHVzLT5ub3Rfc3Vic2NyaWJlZCA9IFRSVUU7CisJCX0KKworCQlpZiAoc3RybmNtcCh2c3RhdHVzLT5hdXRoLCAiZXJyb3IiLCA1KSA9PSAwKSB7CisJCQl2c3RhdHVzLT5ub3RfYXZhaWxhYmxlID0gVFJVRTsKKwkJfQorCQlpZiAoc3RybmNtcCh2c3RhdHVzLT5hdXRoLCAiZGlhbG9nIiwgNikgPT0gMCkgeworCQkJdnN0YXR1cy0+bm90X2F2YWlsYWJsZSA9IFRSVUU7CisJCX0KKworCQlpZiAoc3RybmNtcCh2c3RhdHVzLT5jY2ksICJwcm90ZWN0ZWQiLCA5KSA9PSAwKSB7CisJCQl2c3RhdHVzLT5jb3B5X3Byb3RlY3RlZCA9IFRSVUU7CisJCX0KKwkJaWYgKHN0cm5jbXAodnN0YXR1cy0+Y2dtcywgInByb3RlY3RlZCIsIDkpID09IDApIHsKKwkJCXZzdGF0dXMtPmNvcHlfcHJvdGVjdGVkID0gVFJVRTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfc3RyZWFtaW5mbyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBzdHJlYW1pbmZvKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0cmVhbWluZm86IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvc3RyZWFtaW5mbyIsIGhkLT50dW5lcik7CisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldChoZC0+Y3MsIG5hbWUsIHBzdHJlYW1pbmZvLCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX2NoYW5uZWwoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwY2hhbm5lbCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9jaGFubmVsOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljaGFyIG5hbWVbMzJdOworCXNwcmludGYobmFtZSwgIi90dW5lciV1L2NoYW5uZWwiLCBoZC0+dHVuZXIpOworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCBuYW1lLCBwY2hhbm5lbCwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl92Y2hhbm5lbChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnB2Y2hhbm5lbCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl92Y2hhbm5lbDogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS92Y2hhbm5lbCIsIGhkLT50dW5lcik7CisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldChoZC0+Y3MsIG5hbWUsIHB2Y2hhbm5lbCwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9jaGFubmVsbWFwKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcGNoYW5uZWxtYXApCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfY2hhbm5lbG1hcDogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9jaGFubmVsbWFwIiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgcGNoYW5uZWxtYXAsIE5VTEwpOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfZmlsdGVyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcGZpbHRlcikKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9maWx0ZXI6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvZmlsdGVyIiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgcGZpbHRlciwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9wcm9ncmFtKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHByb2dyYW0pCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfcHJvZ3JhbTogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9wcm9ncmFtIiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgcHByb2dyYW0sIE5VTEwpOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfdGFyZ2V0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHRhcmdldCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl90YXJnZXQ6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvdGFyZ2V0IiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgcHRhcmdldCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfcGxvdHNhbXBsZV9pbnRlcm5hbChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGhkaG9tZXJ1bl9wbG90c2FtcGxlX3QgKipwc2FtcGxlcywgc2l6ZV90ICpwY291bnQpCit7CisJY2hhciAqcmVzdWx0OworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCBuYW1lLCAmcmVzdWx0LCBOVUxMKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqc2FtcGxlcyA9IChzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqKXJlc3VsdDsKKwkqcHNhbXBsZXMgPSBzYW1wbGVzOworCXNpemVfdCBjb3VudCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQljaGFyICpwdHIgPSBzdHJjaHIocmVzdWx0LCAnICcpOworCQlpZiAoIXB0cikgeworCQkJYnJlYWs7CisJCX0KKwkJKnB0cisrID0gMDsKKworCQl1bnNpZ25lZCBsb25nIHJhdzsKKwkJaWYgKHNzY2FuZihyZXN1bHQsICIlbHgiLCAmcmF3KSAhPSAxKSB7CisJCQlicmVhazsKKwkJfQorCisJCXVpbnQxNl90IHJlYWwgPSAocmF3ID4+IDEyKSAmIDB4MEZGRjsKKwkJaWYgKHJlYWwgJiAweDA4MDApIHsKKwkJCXJlYWwgfD0gMHhGMDAwOworCQl9CisKKwkJdWludDE2X3QgaW1hZyA9IChyYXcgPj4gMCkgJiAweDBGRkY7CisJCWlmIChpbWFnICYgMHgwODAwKSB7CisJCQlpbWFnIHw9IDB4RjAwMDsKKwkJfQorCisJCXNhbXBsZXMtPnJlYWwgPSAoaW50MTZfdClyZWFsOworCQlzYW1wbGVzLT5pbWFnID0gKGludDE2X3QpaW1hZzsKKwkJc2FtcGxlcysrOworCQljb3VudCsrOworCisJCXJlc3VsdCA9IHB0cjsKKwl9CisKKwkqcGNvdW50ID0gY291bnQ7CisJcmV0dXJuIDE7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9wbG90c2FtcGxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqKnBzYW1wbGVzLCBzaXplX3QgKnBjb3VudCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9wbG90c2FtcGxlOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljaGFyIG5hbWVbMzJdOworCXNwcmludGYobmFtZSwgIi90dW5lciV1L3Bsb3RzYW1wbGUiLCBoZC0+dHVuZXIpOworCXJldHVybiBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9wbG90c2FtcGxlX2ludGVybmFsKGhkLCBuYW1lLCBwc2FtcGxlcywgcGNvdW50KTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X29vYl9wbG90c2FtcGxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqKnBzYW1wbGVzLCBzaXplX3QgKnBjb3VudCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF9vb2JfcGxvdHNhbXBsZTogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3Bsb3RzYW1wbGVfaW50ZXJuYWwoaGQsICIvb29iL3Bsb3RzYW1wbGUiLCBwc2FtcGxlcywgcGNvdW50KTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX2xvY2trZXlfb3duZXIoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwb3duZXIpCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfbG9ja2tleV9vd25lcjogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9sb2Nra2V5IiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgcG93bmVyLCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2lyX3RhcmdldChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnB0YXJnZXQpCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9nZXRfaXJfdGFyZ2V0OiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgIi9pci90YXJnZXQiLCBwdGFyZ2V0LCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2xpbmV1cF9sb2NhdGlvbihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBsb2NhdGlvbikKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX2dldF9saW5ldXBfbG9jYXRpb246IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCAiL2xpbmV1cC9sb2NhdGlvbiIsIHBsb2NhdGlvbiwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2dldF92ZXJzaW9uKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHZlcnNpb25fc3RyLCB1aW50MzJfdCAqcHZlcnNpb25fbnVtKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3ZlcnNpb246IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgKnZlcnNpb25fc3RyOworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCAiL3N5cy92ZXJzaW9uIiwgJnZlcnNpb25fc3RyLCBOVUxMKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocHZlcnNpb25fc3RyKSB7CisJCSpwdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0cjsKKwl9CisKKwlpZiAocHZlcnNpb25fbnVtKSB7CisJCXVuc2lnbmVkIGxvbmcgdmVyc2lvbl9udW07CisJCWlmIChzc2NhbmYodmVyc2lvbl9zdHIsICIlbHUiLCAmdmVyc2lvbl9udW0pICE9IDEpIHsKKwkJCSpwdmVyc2lvbl9udW0gPSAwOworCQl9IGVsc2UgeworCQkJKnB2ZXJzaW9uX251bSA9ICh1aW50MzJfdCl2ZXJzaW9uX251bTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9nZXRfc3VwcG9ydGVkKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICpwcmVmaXgsIGNoYXIgKipwc3RyKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2NoYW5uZWw6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgKmZlYXR1cmVzOworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9nZXQoaGQtPmNzLCAiL3N5cy9mZWF0dXJlcyIsICZmZWF0dXJlcywgTlVMTCk7CisJaWYgKHJldCA8PSAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFwcmVmaXgpIHsKKwkJKnBzdHIgPSBmZWF0dXJlczsKKwkJcmV0dXJuIDE7CisJfQorCisJY2hhciAqcHRyID0gc3Ryc3RyKGZlYXR1cmVzLCBwcmVmaXgpOworCWlmICghcHRyKSB7CisJCXJldHVybiAwOworCX0KKworCXB0ciArPSBzdHJsZW4ocHJlZml4KTsKKwkqcHN0ciA9IHB0cjsKKworCXB0ciA9IHN0cmNocihwdHIsICdcbicpOworCWlmIChwdHIpIHsKKwkJKnB0ciA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9jaGFubmVsKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICpjaGFubmVsKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2NoYW5uZWw6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvY2hhbm5lbCIsIGhkLT50dW5lcik7CisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX3NldF93aXRoX2xvY2trZXkoaGQtPmNzLCBuYW1lLCBjaGFubmVsLCBoZC0+bG9ja2tleSwgTlVMTCwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl92Y2hhbm5lbChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqdmNoYW5uZWwpCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfdmNoYW5uZWw6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvdmNoYW5uZWwiLCBoZC0+dHVuZXIpOworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9zZXRfd2l0aF9sb2Nra2V5KGhkLT5jcywgbmFtZSwgdmNoYW5uZWwsIGhkLT5sb2Nra2V5LCBOVUxMLCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2NoYW5uZWxtYXAoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKmNoYW5uZWxtYXApCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfY2hhbm5lbG1hcDogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9jaGFubmVsbWFwIiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfc2V0X3dpdGhfbG9ja2tleShoZC0+Y3MsIG5hbWUsIGNoYW5uZWxtYXAsIGhkLT5sb2Nra2V5LCBOVUxMLCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2ZpbHRlcihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqZmlsdGVyKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2ZpbHRlcjogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9maWx0ZXIiLCBoZC0+dHVuZXIpOworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9zZXRfd2l0aF9sb2Nra2V5KGhkLT5jcywgbmFtZSwgZmlsdGVyLCBoZC0+bG9ja2tleSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfZmlsdGVyX2J5X2FycmF5X2FwcGVuZChjaGFyICoqcHB0ciwgY2hhciAqZW5kLCB1aW50MTZfdCByYW5nZV9iZWdpbiwgdWludDE2X3QgcmFuZ2VfZW5kKQoreworCWNoYXIgKnB0ciA9ICpwcHRyOworCisJc2l6ZV90IGF2YWlsYWJsZSA9IGVuZCAtIHB0cjsKKwlzaXplX3QgcmVxdWlyZWQ7CisKKwlpZiAocmFuZ2VfYmVnaW4gPT0gcmFuZ2VfZW5kKSB7CisJCXJlcXVpcmVkID0gc25wcmludGYocHRyLCBhdmFpbGFibGUsICIweCUwNHggIiwgcmFuZ2VfYmVnaW4pICsgMTsKKwl9IGVsc2UgeworCQlyZXF1aXJlZCA9IHNucHJpbnRmKHB0ciwgYXZhaWxhYmxlLCAiMHglMDR4LTB4JTA0eCAiLCByYW5nZV9iZWdpbiwgcmFuZ2VfZW5kKSArIDE7CisJfQorCisJaWYgKHJlcXVpcmVkID4gYXZhaWxhYmxlKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkqcHB0ciA9IHN0cmNocihwdHIsIDApOworCXJldHVybiBUUlVFOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfZmlsdGVyX2J5X2FycmF5KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCB1bnNpZ25lZCBjaGFyIGZpbHRlcl9hcnJheVsweDIwMDBdKQoreworCWNoYXIgZmlsdGVyWzEwMjRdOworCWNoYXIgKnB0ciA9IGZpbHRlcjsKKwljaGFyICplbmQgPSBmaWx0ZXIgKyBzaXplb2YoZmlsdGVyKTsKKworCXVpbnQxNl90IHJhbmdlX2JlZ2luID0gMHhGRkZGOworCXVpbnQxNl90IHJhbmdlX2VuZCA9IDB4RkZGRjsKKworCXVpbnQxNl90IGk7CisJZm9yIChpID0gMDsgaSA8PSAweDFGRkY7IGkrKykgeworCQlpZiAoIWZpbHRlcl9hcnJheVtpXSkgeworCQkJaWYgKHJhbmdlX2JlZ2luID09IDB4RkZGRikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9maWx0ZXJfYnlfYXJyYXlfYXBwZW5kKCZwdHIsIGVuZCwgcmFuZ2VfYmVnaW4sIHJhbmdlX2VuZCkpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJhbmdlX2JlZ2luID0gMHhGRkZGOworCQkJcmFuZ2VfZW5kID0gMHhGRkZGOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmFuZ2VfYmVnaW4gPT0gMHhGRkZGKSB7CisJCQlyYW5nZV9iZWdpbiA9IGk7CisJCQlyYW5nZV9lbmQgPSBpOworCQkJY29udGludWU7CisJCX0KKworCQlyYW5nZV9lbmQgPSBpOworCX0KKworCWlmIChyYW5nZV9iZWdpbiAhPSAweEZGRkYpIHsKKwkJaWYgKCFoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9maWx0ZXJfYnlfYXJyYXlfYXBwZW5kKCZwdHIsIGVuZCwgcmFuZ2VfYmVnaW4sIHJhbmdlX2VuZCkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogUmVtb3ZlIHRyYWlsaW5nIHNwYWNlLiAqLworCWlmIChwdHIgPiBmaWx0ZXIpIHsKKwkJcHRyLS07CisJfQorCSpwdHIgPSAwOworCisJcmV0dXJuIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2ZpbHRlcihoZCwgZmlsdGVyKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX3Byb2dyYW0oc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKnByb2dyYW0pCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfcHJvZ3JhbTogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS9wcm9ncmFtIiwgaGQtPnR1bmVyKTsKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfc2V0X3dpdGhfbG9ja2tleShoZC0+Y3MsIG5hbWUsIHByb2dyYW0sIGhkLT5sb2Nra2V5LCBOVUxMLCBOVUxMKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX3RhcmdldChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqdGFyZ2V0KQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX3RhcmdldDogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhciBuYW1lWzMyXTsKKwlzcHJpbnRmKG5hbWUsICIvdHVuZXIldS90YXJnZXQiLCBoZC0+dHVuZXIpOworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9zZXRfd2l0aF9sb2Nra2V5KGhkLT5jcywgbmFtZSwgdGFyZ2V0LCBoZC0+bG9ja2tleSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfdGFyZ2V0X3RvX2xvY2FsKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICpwcm90b2NvbCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXRfdG9fbG9jYWw6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWhkLT52cykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXRfdG9fbG9jYWw6IHZpZGVvIG5vdCBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgdGFyZ2V0LiAqLworCWNoYXIgdGFyZ2V0WzY0XTsKKwl1aW50MzJfdCBsb2NhbF9pcCA9IGhkaG9tZXJ1bl9jb250cm9sX2dldF9sb2NhbF9hZGRyKGhkLT5jcyk7CisJdWludDE2X3QgbG9jYWxfcG9ydCA9IGhkaG9tZXJ1bl92aWRlb19nZXRfbG9jYWxfcG9ydChoZC0+dnMpOworCXNwcmludGYodGFyZ2V0LCAiJXM6Ly8ldS4ldS4ldS4ldToldSIsCisJCXByb3RvY29sLAorCQkodW5zaWduZWQgaW50KShsb2NhbF9pcCA+PiAyNCkgJiAweEZGLCAodW5zaWduZWQgaW50KShsb2NhbF9pcCA+PiAxNikgJiAweEZGLAorCQkodW5zaWduZWQgaW50KShsb2NhbF9pcCA+PiA4KSAmIDB4RkYsICh1bnNpZ25lZCBpbnQpKGxvY2FsX2lwID4+IDApICYgMHhGRiwKKwkJKHVuc2lnbmVkIGludClsb2NhbF9wb3J0CisJKTsKKworCXJldHVybiBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXQoaGQsIHRhcmdldCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NldF9pcl90YXJnZXQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NldF9pcl90YXJnZXQ6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9zZXQoaGQtPmNzLCAiL2lyL3RhcmdldCIsIHRhcmdldCwgTlVMTCwgTlVMTCk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NldF9saW5ldXBfbG9jYXRpb24oc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2xpbmV1cF9sb2NhdGlvbjogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX3NldChoZC0+Y3MsICIvbGluZXVwL2xvY2F0aW9uIiwgbG9jYXRpb24sIE5VTEwsIE5VTEwpOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9zZXRfc3lzX2R2YmNfbW9kdWxhdGlvbihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqbW9kdWxhdGlvbl9saXN0KQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3N5c19kdmJjX21vZHVsYXRpb246IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF9zZXQoaGQtPmNzLCAiL3N5cy9kdmJjX21vZHVsYXRpb24iLCBtb2R1bGF0aW9uX2xpc3QsIE5VTEwsIE5VTEwpOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdmFyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqcHZhbHVlLCBjaGFyICoqcGVycm9yKQoreworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3ZhcjogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGhkaG9tZXJ1bl9jb250cm9sX2dldChoZC0+Y3MsIG5hbWUsIHB2YWx1ZSwgcGVycm9yKTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3ZhcihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpCit7CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZXRfdmFyOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaGRob21lcnVuX2NvbnRyb2xfc2V0X3dpdGhfbG9ja2tleShoZC0+Y3MsIG5hbWUsIHZhbHVlLCBoZC0+bG9ja2tleSwgcHZhbHVlLCBwZXJyb3IpOworfQorCitpbnQgaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3JlcXVlc3Qoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwZXJyb3IpCit7CisJaWYgKGhkLT5tdWx0aWNhc3RfaXAgIT0gMCkgeworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFoZC0+Y3MpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3JlcXVlc3Q6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXVpbnQzMl90IG5ld19sb2Nra2V5ID0gcmFuZG9tX2dldDMyKCk7CisKKwljaGFyIG5hbWVbMzJdOworCXNwcmludGYobmFtZSwgIi90dW5lciV1L2xvY2trZXkiLCBoZC0+dHVuZXIpOworCisJY2hhciBuZXdfbG9ja2tleV9zdHJbNjRdOworCXNwcmludGYobmV3X2xvY2trZXlfc3RyLCAiJXUiLCAodW5zaWduZWQgaW50KW5ld19sb2Nra2V5KTsKKworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9zZXRfd2l0aF9sb2Nra2V5KGhkLT5jcywgbmFtZSwgbmV3X2xvY2trZXlfc3RyLCBoZC0+bG9ja2tleSwgTlVMTCwgcGVycm9yKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJaGQtPmxvY2trZXkgPSAwOworCQlyZXR1cm4gcmV0OworCX0KKworCWhkLT5sb2Nra2V5ID0gbmV3X2xvY2trZXk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9yZWxlYXNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmIChoZC0+bXVsdGljYXN0X2lwICE9IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9yZWxlYXNlOiBkZXZpY2Ugbm90IHNldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGQtPmxvY2trZXkgPT0gMCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwljaGFyIG5hbWVbMzJdOworCXNwcmludGYobmFtZSwgIi90dW5lciV1L2xvY2trZXkiLCBoZC0+dHVuZXIpOworCWludCByZXQgPSBoZGhvbWVydW5fY29udHJvbF9zZXRfd2l0aF9sb2Nra2V5KGhkLT5jcywgbmFtZSwgIm5vbmUiLCBoZC0+bG9ja2tleSwgTlVMTCwgTlVMTCk7CisKKwloZC0+bG9ja2tleSA9IDA7CisJcmV0dXJuIHJldDsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9mb3JjZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlpZiAoaGQtPm11bHRpY2FzdF9pcCAhPSAwKSB7CisJCXJldHVybiAxOworCX0KKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfZm9yY2U6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoYXIgbmFtZVszMl07CisJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvbG9ja2tleSIsIGhkLT50dW5lcik7CisJaW50IHJldCA9IGhkaG9tZXJ1bl9jb250cm9sX3NldChoZC0+Y3MsIG5hbWUsICJmb3JjZSIsIE5VTEwsIE5VTEwpOworCisJaGQtPmxvY2trZXkgPSAwOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3VzZV92YWx1ZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgdWludDMyX3QgbG9ja2tleSkKK3sKKwlpZiAoaGQtPm11bHRpY2FzdF9pcCAhPSAwKSB7CisJCXJldHVybjsKKwl9CisKKwloZC0+bG9ja2tleSA9IGxvY2trZXk7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3dhaXRfZm9yX2xvY2soc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwkvKiBEZWxheSBmb3IgU1MgcmVhZGluZyB0byBiZSB2YWxpZCAoc2lnbmFsIHByZXNlbnQpLiAqLworCW1zbGVlcF9taW5pbXVtKDI1MCk7CisKKwkvKiBXYWl0IGZvciB1cCB0byAyLjUgc2Vjb25kcyBmb3IgbG9jay4gKi8KKwl1aW50NjRfdCB0aW1lb3V0ID0gZ2V0Y3VycmVudHRpbWUoKSArIDI1MDA7CisJd2hpbGUgKDEpIHsKKwkJLyogR2V0IHN0YXR1cyB0byBjaGVjayBmb3IgbG9jay4gUXVhbGl0eSBudW1iZXJzIHdpbGwgbm90IGJlIHZhbGlkIHlldC4gKi8KKwkJaW50IHJldCA9IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1cyhoZCwgTlVMTCwgc3RhdHVzKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKCFzdGF0dXMtPnNpZ25hbF9wcmVzZW50KSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoc3RhdHVzLT5sb2NrX3N1cHBvcnRlZCB8fCBzdGF0dXMtPmxvY2tfdW5zdXBwb3J0ZWQpIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGdldGN1cnJlbnR0aW1lKCkgPj0gdGltZW91dCkgeworCQkJcmV0dXJuIDE7CisJCX0KKworCQltc2xlZXBfYXBwcm94KDI1MCk7CisJfQorfQorCitpbnQgaGRob21lcnVuX2RldmljZV9zdHJlYW1fc3RhcnQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJaGRob21lcnVuX2RldmljZV9nZXRfdmlkZW9fc29jayhoZCk7CisJaWYgKCFoZC0+dnMpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCB0YXJnZXQuICovCisJaWYgKGhkLT5tdWx0aWNhc3RfaXAgIT0gMCkgeworCQlpbnQgcmV0ID0gaGRob21lcnVuX3ZpZGVvX2pvaW5fbXVsdGljYXN0X2dyb3VwKGhkLT52cywgaGQtPm11bHRpY2FzdF9pcCwgMCk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCWludCByZXQgPSBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXRfdG9fbG9jYWwoaGQsIEhESE9NRVJVTl9UQVJHRVRfUFJPVE9DT0xfUlRQKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXRfdG9fbG9jYWwoaGQsIEhESE9NRVJVTl9UQVJHRVRfUFJPVE9DT0xfVURQKTsKKwkJfQorCQlpZiAocmV0IDw9IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBGbHVzaCB2aWRlbyBidWZmZXIuICovCisJbXNsZWVwX21pbmltdW0oNjQpOworCWhkaG9tZXJ1bl92aWRlb19mbHVzaChoZC0+dnMpOworCisJLyogU3VjY2Vzcy4gKi8KKwlyZXR1cm4gMTsKK30KKwordWludDhfdCAqaGRob21lcnVuX2RldmljZV9zdHJlYW1fcmVjdihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgc2l6ZV90IG1heF9zaXplLCBzaXplX3QgKnBhY3R1YWxfc2l6ZSkKK3sKKwlpZiAoIWhkLT52cykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9yZWN2OiB2aWRlbyBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaGRob21lcnVuX3ZpZGVvX3JlY3YoaGQtPnZzLCBtYXhfc2l6ZSwgcGFjdHVhbF9zaXplKTsKK30KKwordm9pZCBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9mbHVzaChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlpZiAoIWhkLT52cykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9mbHVzaDogdmlkZW8gbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhkaG9tZXJ1bl92aWRlb19mbHVzaChoZC0+dnMpOworfQorCit2b2lkIGhkaG9tZXJ1bl9kZXZpY2Vfc3RyZWFtX3N0b3Aoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJaWYgKCFoZC0+dnMpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zdHJlYW1fc3RvcDogdmlkZW8gbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZC0+bXVsdGljYXN0X2lwICE9IDApIHsKKwkJaGRob21lcnVuX3ZpZGVvX2xlYXZlX211bHRpY2FzdF9ncm91cChoZC0+dnMsIGhkLT5tdWx0aWNhc3RfaXAsIDApOworCX0gZWxzZSB7CisJCWhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX3RhcmdldChoZCwgIm5vbmUiKTsKKwl9Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2NoYW5uZWxzY2FuX2luaXQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKmNoYW5uZWxtYXApCit7CisJaWYgKGhkLT5zY2FuKSB7CisJCWNoYW5uZWxzY2FuX2Rlc3Ryb3koaGQtPnNjYW4pOworCX0KKworCWhkLT5zY2FuID0gY2hhbm5lbHNjYW5fY3JlYXRlKGhkLCBjaGFubmVsbWFwKTsKKwlpZiAoIWhkLT5zY2FuKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5faW5pdDogZmFpbGVkIHRvIGNyZWF0ZSBzY2FuIG9iamVjdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5fYWR2YW5jZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCAqcmVzdWx0KQoreworCWlmICghaGQtPnNjYW4pIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9jaGFubmVsc2Nhbl9hZHZhbmNlOiBzY2FuIG5vdCBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWludCByZXQgPSBjaGFubmVsc2Nhbl9hZHZhbmNlKGhkLT5zY2FuLCByZXN1bHQpOworCWlmIChyZXQgPD0gMCkgeyAvKiBGcmVlIHNjYW4gaWYgbm9ybWFsIGZpbmlzaCBvciBmYXRhbCBlcnJvciAqLworCQljaGFubmVsc2Nhbl9kZXN0cm95KGhkLT5zY2FuKTsKKwkJaGQtPnNjYW4gPSBOVUxMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX2NoYW5uZWxzY2FuX2RldGVjdChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgc3RydWN0IGhkaG9tZXJ1bl9jaGFubmVsc2Nhbl9yZXN1bHRfdCAqcmVzdWx0KQoreworCWlmICghaGQtPnNjYW4pIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9jaGFubmVsc2Nhbl9kZXRlY3Q6IHNjYW4gbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW50IHJldCA9IGNoYW5uZWxzY2FuX2RldGVjdChoZC0+c2NhbiwgcmVzdWx0KTsKKwlpZiAocmV0IDwgMCkgeyAvKiBGcmVlIHNjYW4gaWYgZmF0YWwgZXJyb3IgKi8KKwkJY2hhbm5lbHNjYW5fZGVzdHJveShoZC0+c2Nhbik7CisJCWhkLT5zY2FuID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit1aW50OF90IGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5fZ2V0X3Byb2dyZXNzKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmICghaGQtPnNjYW4pIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9jaGFubmVsc2Nhbl9nZXRfcHJvZ3Jlc3M6IHNjYW4gbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGNoYW5uZWxzY2FuX2dldF9wcm9ncmVzcyhoZC0+c2Nhbik7Cit9CisKK2NvbnN0IGNoYXIgKmhkaG9tZXJ1bl9kZXZpY2VfZ2V0X21vZGVsX3N0cihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCkKK3sKKwlpZiAoKmhkLT5tb2RlbCkgeworCQlyZXR1cm4gaGQtPm1vZGVsOworCX0KKworCWlmICghaGQtPmNzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2VfZ2V0X21vZGVsX3N0cjogZGV2aWNlIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljaGFyICptb2RlbF9zdHI7CisJaW50IHJldCA9IGhkaG9tZXJ1bl9jb250cm9sX2dldChoZC0+Y3MsICIvc3lzL21vZGVsIiwgJm1vZGVsX3N0ciwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChyZXQgPT0gMCkgeworCQlzdHJuY3B5KGhkLT5tb2RlbCwgImhkaG9tZXJ1bl9hdHNjIiwgc2l6ZW9mKGhkLT5tb2RlbCkgLSAxKTsKKwkJaGQtPm1vZGVsW3NpemVvZihoZC0+bW9kZWwpIC0gMV0gPSAwOworCQlyZXR1cm4gaGQtPm1vZGVsOworCX0KKworCXN0cm5jcHkoaGQtPm1vZGVsLCBtb2RlbF9zdHIsIHNpemVvZihoZC0+bW9kZWwpIC0gMSk7CisJaGQtPm1vZGVsW3NpemVvZihoZC0+bW9kZWwpIC0gMV0gPSAwOworCXJldHVybiBoZC0+bW9kZWw7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3VwZ3JhZGUoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIEZJTEUgKnVwZ3JhZGVfZmlsZSkKK3sKKwlpZiAoIWhkLT5jcykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3VwZ3JhZGU6IGRldmljZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhkaG9tZXJ1bl9jb250cm9sX3NldChoZC0+Y3MsICIvdHVuZXIwL2xvY2trZXkiLCAiZm9yY2UiLCBOVUxMLCBOVUxMKTsKKwloZGhvbWVydW5fY29udHJvbF9zZXQoaGQtPmNzLCAiL3R1bmVyMC9jaGFubmVsIiwgIm5vbmUiLCBOVUxMLCBOVUxMKTsKKworCWhkaG9tZXJ1bl9jb250cm9sX3NldChoZC0+Y3MsICIvdHVuZXIxL2xvY2trZXkiLCAiZm9yY2UiLCBOVUxMLCBOVUxMKTsKKwloZGhvbWVydW5fY29udHJvbF9zZXQoaGQtPmNzLCAiL3R1bmVyMS9jaGFubmVsIiwgIm5vbmUiLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiBoZGhvbWVydW5fY29udHJvbF91cGdyYWRlKGhkLT5jcywgdXBncmFkZV9maWxlKTsKK30KKwordm9pZCBoZGhvbWVydW5fZGV2aWNlX2RlYnVnX3ByaW50X3ZpZGVvX3N0YXRzKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCWlmICghaGRob21lcnVuX2RlYnVnX2VuYWJsZWQoaGQtPmRiZykpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZC0+Y3MpIHsKKwkJY2hhciBuYW1lWzMyXTsKKwkJc3ByaW50ZihuYW1lLCAiL3R1bmVyJXUvZGVidWciLCBoZC0+dHVuZXIpOworCisJCWNoYXIgKmRlYnVnX3N0cjsKKwkJY2hhciAqZXJyb3Jfc3RyOworCQlpbnQgcmV0ID0gaGRob21lcnVuX2NvbnRyb2xfZ2V0KGhkLT5jcywgbmFtZSwgJmRlYnVnX3N0ciwgJmVycm9yX3N0cik7CisJCWlmIChyZXQgPCAwKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJ2aWRlbyBkZXY6IGNvbW11bmljYXRpb24gZXJyb3IgZ2V0dGluZyBkZWJ1ZyBzdGF0c1xuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoZXJyb3Jfc3RyKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkLT5kYmcsICJ2aWRlbyBkZXY6ICVzXG4iLCBlcnJvcl9zdHIpOworCQl9IGVsc2UgeworCQkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZC0+ZGJnLCAidmlkZW8gZGV2OiAlc1xuIiwgZGVidWdfc3RyKTsKKwkJfQorCX0KKworCWlmIChoZC0+dnMpIHsKKwkJaGRob21lcnVuX3ZpZGVvX2RlYnVnX3ByaW50X3N0YXRzKGhkLT52cyk7CisJfQorfQorCit2b2lkIGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3ZpZGVvX3N0YXRzKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3N0YXRzX3QgKnN0YXRzKQoreworCWlmICghaGQtPnZzKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGQtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc3RyZWFtX2ZsdXNoOiB2aWRlbyBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQltZW1zZXQoc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3N0YXRzX3QpKTsKKwkJcmV0dXJuOworCX0KKworCWhkaG9tZXJ1bl92aWRlb19nZXRfc3RhdHMoaGQtPnZzLCBzdGF0cyk7Cit9CmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2RldmljZS5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MWMyYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2UuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIGhkaG9tZXJ1bl9kZXZpY2UuaAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDggU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgSERIT01FUlVOX0RFVklDRV9NQVhfVFVORV9UT19MT0NLX1RJTUUgMTUwMAorI2RlZmluZSBIREhPTUVSVU5fREVWSUNFX01BWF9MT0NLX1RPX0RBVEFfVElNRSAyMDAwCisjZGVmaW5lIEhESE9NRVJVTl9ERVZJQ0VfTUFYX1RVTkVfVE9fREFUQV9USU1FIChIREhPTUVSVU5fREVWSUNFX01BWF9UVU5FX1RPX0xPQ0tfVElNRSArIEhESE9NRVJVTl9ERVZJQ0VfTUFYX0xPQ0tfVE9fREFUQV9USU1FKQorCisjZGVmaW5lIEhESE9NRVJVTl9UQVJHRVRfUFJPVE9DT0xfVURQICJ1ZHAiCisjZGVmaW5lIEhESE9NRVJVTl9UQVJHRVRfUFJPVE9DT0xfUlRQICJydHAiCisKKy8qCisgKiBDcmVhdGUgYSBkZXZpY2Ugb2JqZWN0LgorICoKKyAqIFR5cGljYWxseSBhIGRldmljZSBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGZvciBlYWNoIHR1bmVyLgorICogSXQgaXMgdmFsaWQgdG8gaGF2ZSBtdWx0aXBsZSBkZXZpY2Ugb2JqZWN0cyBjb21tdW5pY2F0aW5nIHdpdGggYSBzaW5nbGUgSERIb21lUnVuLgorICoKKyAqIEZvciBleGFtcGxlLCBhIHRocmVhZGVkIGFwcGxpY2F0aW9uIHRoYXQgc3RyZWFtcyB2aWRlbyBmcm9tIDQgdHVuZXJzICgyIEhESG9tZVJ1biBkZXZpY2VzKSBhbmQgaGFzCisgKiBHVUkgZmVlZGJhY2sgdG8gdGhlIHVzZXIgb2YgdGhlIHNlbGVjdGVkIHR1bmVyIG1pZ2h0IHVzZSA1IGRldmljZSBvYmplY3RzOiA0IGZvciBzdHJlYW1pbmcgdmlkZW8KKyAqIChvbmUgcGVyIHRocmVhZCkgYW5kIG9uZSBmb3IgdGhlIEdVSSBkaXNwbGF5IHRoYXQgY2FuIHN3aXRjaCBiZXR3ZWVuIHR1bmVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGUgZGV2aWNlLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gZmlyc3QgdXNlZC4KKyAqCisgKiB1aW50MzJfdCBkZXZpY2VfaWQgPSAzMi1iaXQgZGV2aWNlIGlkIG9mIGRldmljZS4gU2V0IHRvIEhESE9NRVJVTl9ERVZJQ0VfSURfV0lMRENBUkQgdG8gbWF0Y2ggYW55IGRldmljZSBJRC4KKyAqIHVpbnQzMl90IGRldmljZV9pcCA9IElQIGFkZHJlc3Mgb2YgZGV2aWNlLiBTZXQgdG8gMCB0byBhdXRvLWRldGVjdC4KKyAqIHVuc2lnbmVkIGludCB0dW5lciA9IHR1bmVyIGluZGV4ICgwIG9yIDEpLiBDYW4gYmUgY2hhbmdlZCBsYXRlciBieSBjYWxsaW5nIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyLgorICogc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmc6IFBvaW50ZXIgdG8gZGVidWcgbG9nZ2luZyBvYmplY3QuIE1heSBiZSBOVUxMLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGRldmljZSBvYmplY3QuCisgKgorICogV2hlbiBubyBsb25nZXIgbmVlZGVkLCB0aGUgc29ja2V0IHNob3VsZCBiZSBkZXN0cm95ZWQgYnkgY2FsbGluZyBoZGhvbWVydW5fZGV2aWNlX2Rlc3Ryb3kuCisgKgorICogVGhlIGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyIGZ1bmN0aW9uIGNyZWF0ZXMgYSBkZXZpY2Ugb2JqZWN0IGZyb20gdGhlIGdpdmVuIGRldmljZV9zdHIuCisgKiBUaGUgZGV2aWNlX3N0ciBwYXJhbWV0ZXIgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorICogICAgIDxkZXZpY2UgaWQ+CisgKiAgICAgPGRldmljZSBpZD4tPHR1bmVyIGluZGV4PgorICogICAgIDxpcCBhZGRyZXNzPgorICogSWYgdGhlIHR1bmVyIGluZGV4IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGV2aWNlX3N0ciB0aGVuIGl0IGlzIHNldCB0byB6ZXJvLiBVc2UgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXIKKyAqIG9yIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2Zyb21fc3RyIHRvIHNldCB0aGUgdHVuZXIuCisgKgorICogVGhlIGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2Zyb21fc3RyIGZ1bmN0aW9uIHNldHMgdGhlIHR1bmVyIGZyb20gdGhlIGdpdmVuIHR1bmVyX3N0ci4KKyAqIFRoZSB0dW5lcl9zdHIgcGFyYW1ldGVyIGNhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAqICAgICA8dHVuZXIgaW5kZXg+CisgKiAgICAgL3R1bmVyPHR1bmVyIGluZGV4PgorICovCitleHRlcm4gTElCVFlQRSBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZSh1aW50MzJfdCBkZXZpY2VfaWQsIHVpbnQzMl90IGRldmljZV9pcCwgdW5zaWduZWQgaW50IHR1bmVyLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CitleHRlcm4gTElCVFlQRSBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZV9mcm9tX3N0cihjb25zdCBjaGFyICpkZXZpY2Vfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZyk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CisKKy8qCisgKiBHZXQgdGhlIGRldmljZSBpZCwgaXAsIG9yIHR1bmVyIG9mIHRoZSBkZXZpY2UgaW5zdGFuY2UuCisgKi8KK2V4dGVybiBMSUJUWVBFIGNvbnN0IGNoYXIgKmhkaG9tZXJ1bl9kZXZpY2VfZ2V0X25hbWUoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpOworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfZGV2aWNlX2lkKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2RldmljZV9pcChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CitleHRlcm4gTElCVFlQRSB1aW50MzJfdCBoZGhvbWVydW5fZGV2aWNlX2dldF9kZXZpY2VfaWRfcmVxdWVzdGVkKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2RldmljZV9pcF9yZXF1ZXN0ZWQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpOworZXh0ZXJuIExJQlRZUEUgdW5zaWduZWQgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKKworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2RldmljZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgdWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBkZXZpY2VfaXApOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCB1bnNpZ25lZCBpbnQgdHVuZXIpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3R1bmVyX2Zyb21fc3RyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICp0dW5lcl9zdHIpOworCisvKgorICogR2V0IHRoZSBsb2NhbCBtYWNoaW5lIElQIGFkZHJlc3MgdXNlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgSVAgYWRkcmVzcyB0byB1c2Ugd2l0aCBzZXQgdGFyZ2V0IGNvbW1hbmRzLgorICoKKyAqIFJldHVybnMgMzItYml0IElQIGFkZHJlc3Mgd2l0aCBuYXRpdmUgZW5kaWFubmVzcywgb3IgMCBvbiBlcnJvci4KKyAqLworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX2RldmljZV9nZXRfbG9jYWxfbWFjaGluZV9hZGRyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKKworLyoKKyAqIEdldCBvcGVyYXRpb25zLgorICoKKyAqIHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgKnN0YXR1cyA9IFBvaW50ZXIgdG8gY2FsbGVyIHN1cHBsaWVkIHN0YXR1cyBzdHJ1Y3QgdG8gYmUgcG9wdWxhdGVkIHdpdGggcmVzdWx0LgorICogY29uc3QgY2hhciAqKnA8bmFtZT4gPSBDYWxsZXIgc3VwcGxpZWQgY2hhciAqIHRvIGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIHJlc3VsdCBzdHJpbmcuIFRoZSBzdHJpbmcgd2lsbCByZW1haW4KKyAqCQl2YWxpZCB1bnRpbCBhbm90aGVyIGNhbGwgdG8gYSBkZXZpY2UgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKiBSZXR1cm5zIDAgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQuCisgKiBSZXR1cm5zIC0xIGlmIGEgY29tbXVuaWNhdGlvbiBlcnJvciBvY2N1cnJlZC4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1cyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBzdGF0dXNfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX3R1bmVyX3N0YXR1c190ICpzdGF0dXMpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3ZzdGF0dXMoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwdnN0YXR1c19zdHIsIHN0cnVjdCBoZGhvbWVydW5fdHVuZXJfdnN0YXR1c190ICp2c3RhdHVzKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9zdHJlYW1pbmZvKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHN0cmVhbWluZm8pOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX2NoYW5uZWwoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwY2hhbm5lbCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfdmNoYW5uZWwoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwdmNoYW5uZWwpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX2NoYW5uZWxtYXAoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwY2hhbm5lbG1hcCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfZmlsdGVyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcGZpbHRlcik7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfcHJvZ3JhbShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBwcm9ncmFtKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl90YXJnZXQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKipwdGFyZ2V0KTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9wbG90c2FtcGxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqKnBzYW1wbGVzLCBzaXplX3QgKnBjb3VudCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXJfbG9ja2tleV9vd25lcihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBvd25lcik7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfb29iX3N0YXR1cyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY2hhciAqKnBzdGF0dXNfc3RyLCBzdHJ1Y3QgaGRob21lcnVuX3R1bmVyX3N0YXR1c190ICpzdGF0dXMpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X29vYl9wbG90c2FtcGxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX3Bsb3RzYW1wbGVfdCAqKnBzYW1wbGVzLCBzaXplX3QgKnBjb3VudCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfaXJfdGFyZ2V0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHRhcmdldCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9nZXRfbGluZXVwX2xvY2F0aW9uKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcGxvY2F0aW9uKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF92ZXJzaW9uKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcHZlcnNpb25fc3RyLCB1aW50MzJfdCAqcHZlcnNpb25fbnVtKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF9zdXBwb3J0ZWQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNoYXIgKnByZWZpeCwgY2hhciAqKnBzdHIpOworCitleHRlcm4gTElCVFlQRSB1aW50MzJfdCBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl9zdGF0dXNfc3NfY29sb3Ioc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCAqc3RhdHVzKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1c19zbnFfY29sb3Ioc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCAqc3RhdHVzKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X3R1bmVyX3N0YXR1c19zZXFfY29sb3Ioc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCAqc3RhdHVzKTsKKworZXh0ZXJuIExJQlRZUEUgY29uc3QgY2hhciAqaGRob21lcnVuX2RldmljZV9nZXRfbW9kZWxfc3RyKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKKworLyoKKyAqIFNldCBvcGVyYXRpb25zLgorICoKKyAqIGNvbnN0IGNoYXIgKjxuYW1lPiA9IFN0cmluZyB0byBzZW5kIHRvIGRldmljZS4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqIFJldHVybnMgMCBpZiB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZC4KKyAqIFJldHVybnMgLTEgaWYgYSBjb21tdW5pY2F0aW9uIGVycm9yIG9jY3VycmVkLgorICovCitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfY2hhbm5lbChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqY2hhbm5lbCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfdmNoYW5uZWwoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKnZjaGFubmVsKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9jaGFubmVsbWFwKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICpjaGFubmVsbWFwKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9maWx0ZXIoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKmZpbHRlcik7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfdHVuZXJfZmlsdGVyX2J5X2FycmF5KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCB1bnNpZ25lZCBjaGFyIGZpbHRlcl9hcnJheVsweDIwMDBdKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl9wcm9ncmFtKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICpwcm9ncmFtKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NldF90dW5lcl90YXJnZXQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKnRhcmdldCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9zZXRfaXJfdGFyZ2V0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjb25zdCBjaGFyICp0YXJnZXQpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X2xpbmV1cF9sb2NhdGlvbihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqbG9jYXRpb24pOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3N5c19kdmJjX21vZHVsYXRpb24oc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKm1vZHVsYXRpb25fbGlzdCk7CisKKy8qCisgKiBHZXQvc2V0IGEgbmFtZWQgY29udHJvbCB2YXJpYWJsZSBvbiB0aGUgZGV2aWNlLgorICoKKyAqIGNvbnN0IGNoYXIgKm5hbWU6IFRoZSBuYW1lIG9mIHZhciB0byBnZXQvc2V0IChjLXN0cmluZykuIFRoZSBzdXBwb3J0ZWQgdmFycyBpcyBkZXZpY2UvZmlybXdhcmUgZGVwZW5kYW50LgorICogY29uc3QgY2hhciAqdmFsdWU6IFRoZSB2YWx1ZSB0byBzZXQgKGMtc3RyaW5nKS4gVGhlIGZvcm1hdCBpcyBkZXZpY2UvZmlybXdhcmUgZGVwZW5kYW50LgorCisgKiBjaGFyICoqcHZhbHVlOiBJZiBwcm92aWRlZCwgdGhlIGNhbGxlci1zdXBwbGllZCBjaGFyIHBvaW50ZXIgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlCisgKgkJc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBkZXZpY2UsIG9yIE5VTEwgaWYgdGhlIGRldmljZSByZXR1cm5lZCBhbiBlcnJvciBzdHJpbmcuIFRoZSBzdHJpbmcgd2lsbCByZW1haW4KKyAqCQl2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGEgY29udHJvbCBzb2NrIGZ1bmN0aW9uLgorICogY2hhciAqKnBlcnJvcjogSWYgcHJvdmlkZWQsIHRoZSBjYWxsZXItc3VwcGxpZWQgY2hhciBwb2ludGVyIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSBwb2ludGVyIHRvIHRoZSBlcnJvcgorICoJCXN0cmluZyByZXR1cm5lZCBieSB0aGUgZGV2aWNlLCBvciBOVUxMIGlmIHRoZSBkZXZpY2UgcmV0dXJuZWQgYW4gdmFsdWUgc3RyaW5nLiBUaGUgc3RyaW5nIHdpbGwgcmVtYWluCisgKgkJdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBhIGNvbnRyb2wgc29jayBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAocHZhbHVlIHNldCwgcGVycm9yIE5VTEwpLgorICogUmV0dXJucyAwIGlmIHRoZSBvcGVyYXRpb24gd2FzIHJlamVjdGVkIChwdmFsdWUgTlVMTCwgcGVycm9yIHNldCkuCisgKiBSZXR1cm5zIC0xIGlmIGEgY29tbXVuaWNhdGlvbiBlcnJvciBvY2N1cnMuCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX2dldF92YXIoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc2V0X3ZhcihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNoYXIgKipwdmFsdWUsIGNoYXIgKipwZXJyb3IpOworCisvKgorICogVHVuZXIgbG9ja2luZy4KKyAqCisgKiBUaGUgaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3JlcXVlc3QgZnVuY3Rpb24gaXMgdXNlZCB0byBvYnRhaW4gYSBsb2NrCisgKiBvciB0byB2ZXJpZnkgdGhhdCB0aGUgaGRob21lcnVuX2RldmljZSBvYmplY3Qgc3RpbGwgaG9sZHMgdGhlIGxvY2suCisgKiBSZXR1cm5zIDEgaWYgdGhlIGxvY2sgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIGxvY2sgd2FzIG9idGFpbmVkLgorICogUmV0dXJucyAwIGlmIHRoZSBsb2NrIHJlcXVlc3Qgd2FzIHJlamVjdGVkLgorICogUmV0dXJucyAtMSBpZiBhIGNvbW11bmljYXRpb24gZXJyb3Igb2NjdXJzLgorICoKKyAqIFRoZSBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbGVhc2UgYQorICogcHJldmlvdXNseSBoZWxkIGxvY2suIElmIGxvY2tpbmcgaXMgdXNlZCB0aGVuIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKKyAqIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBoZGhvbWVydW5fZGV2aWNlIG9iamVjdC4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9yZXF1ZXN0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBjaGFyICoqcGVycm9yKTsKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X2ZvcmNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKKworLyoKKyAqIEludGVuZGVkIG9ubHkgZm9yIG5vbiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zOyBlZywgaGRob21lcnVuX2NvbmZpZy4KKyAqLworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfdXNlX3ZhbHVlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCB1aW50MzJfdCBsb2Nra2V5KTsKKworLyoKKyAqIFdhaXQgZm9yIHR1bmVyIGxvY2sgYWZ0ZXIgY2hhbm5lbCBjaGFuZ2UuCisgKgorICogVGhlIGhkaG9tZXJ1bl9kZXZpY2Vfd2FpdF9mb3JfbG9jayBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdC93YWl0IGZvciBhIGxvY2sgdnMgbm8gbG9jayBpbmRpY2F0aW9uCisgKiBhZnRlciBhIGNoYW5uZWwgY2hhbmdlLgorICoKKyAqIEl0IHdpbGwgcmV0dXJuIHF1aWNrbHkgaWYgYSBsb2NrIGlzIGFxdWlyZWQuCisgKiBJdCB3aWxsIHJldHVybiBxdWlja2x5IGlmIHRoZXJlIGlzIG5vIHNpZ25hbCBkZXRlY3RlZC4KKyAqIFdvcnN0IGNhc2UgaXQgd2lsbCB0aW1lIG91dCBhZnRlciAxLjUgc2Vjb25kcyAtIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIHNpZ25hbCBidXQgbm8gbG9jay4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfd2FpdF9mb3JfbG9jayhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgc3RydWN0IGhkaG9tZXJ1bl90dW5lcl9zdGF0dXNfdCAqc3RhdHVzKTsKKworLyoKKyAqIFN0cmVhbSBhIGZpbHRlcmVkIHByb2dyYW0gb3IgdGhlIHVuZmlsdGVyZWQgc3RyZWFtLgorICoKKyAqIFRoZSBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9zdGFydCBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcHJvY2VzcyBhbmQgdGVsbHMgdGhlIGRldmljZSB0byBzdGFydCBzdHJlYW1pbiBkYXRhLgorICoKKyAqIHVpbnQxNl90IHByb2dyYW1fbnVtYmVyID0gVGhlIHByb2dyYW0gbnVtYmVyIHRvIGZpbGVyLCBvciAwIGZvciB1bmZpbHRlcmVkLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgb3BydGF0aW9uIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LgorICogUmV0dXJucyAwIGlmIHRoZSBvcGVyYXRpb24gd2FzIHJlamVjdGVkLgorICogUmV0dXJucyAtMSBpZiBhIGNvbW11bmljYXRpb24gZXJyb3Igb2NjdXJzLgorICoKKyAqIFRoZSBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9yZWN2IGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHJlY2VpdmUgdGhlIHN0cmVhbSBkYXRhLgorICogVGhlIGJ1ZmZlciBjYW4gbG9zc2xlc3NseSBzdG9yZSAxIHNlY29uZCBvZiBkYXRhLCBob3dldmVyIGEgbW9yZSB0eXBpY2FsIGNhbGwgcmF0ZSB3b3VsZCBiZSBldmVyeSAxNW1zLgorICoKKyAqIFRoZSBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9zdG9wIGZ1bmN0aW9uIHRlbGxzIHRoZSBkZXZpY2UgdG8gc3RvcCBzdHJlYW1pbmcgZGF0YS4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2Vfc3RyZWFtX3N0YXJ0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQ4X3QgKmhkaG9tZXJ1bl9kZXZpY2Vfc3RyZWFtX3JlY3Yoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIHNpemVfdCBtYXhfc2l6ZSwgc2l6ZV90ICpwYWN0dWFsX3NpemUpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGV2aWNlX3N0cmVhbV9mbHVzaChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZXZpY2Vfc3RyZWFtX3N0b3Aoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpOworCisvKgorICogQ2hhbm5lbCBzY2FuIEFQSS4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5faW5pdChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgY29uc3QgY2hhciAqY2hhbm5lbG1hcCk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9jaGFubmVsc2Nhbl9hZHZhbmNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Jlc3VsdF90ICpyZXN1bHQpOworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kZXZpY2VfY2hhbm5lbHNjYW5fZGV0ZWN0KHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkLCBzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Jlc3VsdF90ICpyZXN1bHQpOworZXh0ZXJuIExJQlRZUEUgdWludDhfdCBoZGhvbWVydW5fZGV2aWNlX2NoYW5uZWxzY2FuX2dldF9wcm9ncmVzcyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CisKKy8qCisgKiBVcGxvYWQgbmV3IGZpcm13YXJlIHRvIHRoZSBkZXZpY2UuCisgKgorICogRklMRSAqdXBncmFkZV9maWxlOiBGaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLiBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiBvcGVuZWQgaW4gYmluYXJ5IG1vZGUgZm9yIHJlYWRpbmcuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSB1cGxvYWQgc3VjY2VlZGVkLgorICogUmV0dXJucyAwIGlmIHRoZSB1cGxvYWQgd2FzIHJlamVjdGVkLgorICogUmV0dXJucyAtMSBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3VwZ3JhZGUoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQsIEZJTEUgKnVwZ3JhZGVfZmlsZSk7CisKKy8qCisgKiBMb3cgbGV2ZWwgYWNjZXNzb3IgZnVuY3Rpb25zLiAKKyAqLworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9jb250cm9sX3NvY2tfdCAqaGRob21lcnVuX2RldmljZV9nZXRfY29udHJvbF9zb2NrKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKK2V4dGVybiBMSUJUWVBFIHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICpoZGhvbWVydW5fZGV2aWNlX2dldF92aWRlb19zb2NrKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKTsKKworLyoKKyAqIERlYnVnIHByaW50IGludGVybmFsIHN0YXRzLgorICovCitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9kZXZpY2VfZGVidWdfcHJpbnRfdmlkZW9fc3RhdHMoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGV2aWNlX2dldF92aWRlb19zdGF0cyhzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCwgc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zdGF0c190ICpzdGF0cyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX2RldmljZV9zZWxlY3Rvci5jIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTdmMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3IuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3IuYworICoKKyAqIENvcHlyaWdodCDCqSAyMDA5LTIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaGRob21lcnVuLmgiCisKK3N0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgeworCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKipoZF9saXN0OworCXNpemVfdCBoZF9jb3VudDsKKwlzdHJ1Y3QgaGRob21lcnVuX2RlYnVnX3QgKmRiZzsKK307CisKK3N0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY3JlYXRlKHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKQoreworCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcyA9IChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90KSk7CisJaWYgKCFoZHMpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihkYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2NyZWF0ZTogZmFpbGVkIHRvIGFsbG9jYXRlIHNlbGVjdG9yIG9iamVjdFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWhkcy0+ZGJnID0gZGJnOworCisJcmV0dXJuIGhkczsKK30KKwordm9pZCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzLCBib29sX3QgZGVzdHJveV9kZXZpY2VzKQoreworCWlmIChkZXN0cm95X2RldmljZXMpIHsKKwkJc2l6ZV90IGluZGV4OworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBoZHMtPmhkX2NvdW50OyBpbmRleCsrKSB7CisJCQlzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICplbnRyeSA9IGhkcy0+aGRfbGlzdFtpbmRleF07CisJCQloZGhvbWVydW5fZGV2aWNlX2Rlc3Ryb3koZW50cnkpOworCQl9CisJfQorCisJaWYgKGhkcy0+aGRfbGlzdCkgeworCQlmcmVlKGhkcy0+aGRfbGlzdCk7CisJfQorCisJZnJlZShoZHMpOworfQorCitMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2dldF9kZXZpY2VfY291bnQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzKQoreworCXJldHVybiAoaW50KWhkcy0+aGRfY291bnQ7Cit9CisKK3ZvaWQgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9hZGRfZGV2aWNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpCit7CisJc2l6ZV90IGluZGV4OworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGhkcy0+aGRfY291bnQ7IGluZGV4KyspIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqZW50cnkgPSBoZHMtPmhkX2xpc3RbaW5kZXhdOworCQlpZiAoZW50cnkgPT0gaGQpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWhkcy0+aGRfbGlzdCA9IChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICoqKXJlYWxsb2MoaGRzLT5oZF9saXN0LCAoaGRzLT5oZF9jb3VudCArIDEpICogc2l6ZW9mKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKikpOworCWlmICghaGRzLT5oZF9saXN0KSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2FkZF9kZXZpY2U6IGZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgbGlzdFxuIik7CisJCXJldHVybjsKKwl9CisKKwloZHMtPmhkX2xpc3RbaGRzLT5oZF9jb3VudCsrXSA9IGhkOworfQorCit2b2lkIGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfcmVtb3ZlX2RldmljZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICpoZHMsIHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkKQoreworCXNpemVfdCBpbmRleCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGluZGV4ID49IGhkcy0+aGRfY291bnQpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmVudHJ5ID0gaGRzLT5oZF9saXN0W2luZGV4XTsKKwkJaWYgKGVudHJ5ID09IGhkKSB7CisJCQlicmVhazsKKwkJfQorCisJCWluZGV4Kys7CisJfQorCisJd2hpbGUgKGluZGV4ICsgMSA8IGhkcy0+aGRfY291bnQpIHsKKwkJaGRzLT5oZF9saXN0W2luZGV4XSA9IGhkcy0+aGRfbGlzdFtpbmRleCArIDFdOworCQlpbmRleCsrOworCX0KKworCWhkcy0+aGRfbGlzdFtpbmRleF0gPSBOVUxMOworCWhkcy0+aGRfY291bnQtLTsKK30KKworc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9maW5kX2RldmljZShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICpoZHMsIHVpbnQzMl90IGRldmljZV9pZCwgdW5zaWduZWQgaW50IHR1bmVyX2luZGV4KQoreworCXNpemVfdCBpbmRleDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBoZHMtPmhkX2NvdW50OyBpbmRleCsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmVudHJ5ID0gaGRzLT5oZF9saXN0W2luZGV4XTsKKwkJaWYgKGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X2RldmljZV9pZChlbnRyeSkgIT0gZGV2aWNlX2lkKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaGRob21lcnVuX2RldmljZV9nZXRfdHVuZXIoZW50cnkpICE9IHR1bmVyX2luZGV4KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXR1cm4gZW50cnk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2xvYWRfZnJvbV9maWxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlKDEpIHsKKwkJY2hhciBkZXZpY2VfbmFtZVszMl07CisJCWlmICghZmdldHMoZGV2aWNlX25hbWUsIHNpemVvZihkZXZpY2VfbmFtZSksIGZwKSkgeworCQkJYnJlYWs7CisJCX0KKworCQlzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCA9IGhkaG9tZXJ1bl9kZXZpY2VfY3JlYXRlX2Zyb21fc3RyKGRldmljZV9uYW1lLCBoZHMtPmRiZyk7CisJCWlmICghaGQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9hZGRfZGV2aWNlKGhkcywgaGQpOworCX0KKworCWZjbG9zZShmcCk7CisJcmV0dXJuIChpbnQpaGRzLT5oZF9jb3VudDsKK30KKworI2lmIGRlZmluZWQoX19XSU5ET1dTX18pCitpbnQgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9sb2FkX2Zyb21fd2luZG93c19yZWdpc3RyeShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICpoZHMsIHdjaGFyX3QgKndzb3VyY2UpCit7CisJSEtFWSB0dW5lcnNfa2V5OworCUxPTkcgcmV0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgTCJTT0ZUV0FSRVxcU2lsaWNvbmR1c3RcXEhESG9tZVJ1blxcVHVuZXJzIiwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX0VOVU1FUkFURV9TVUJfS0VZUywgJnR1bmVyc19rZXkpOworCWlmIChyZXQgIT0gRVJST1JfU1VDQ0VTUykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkcy0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9sb2FkX2Zyb21fd2luZG93c19yZWdpc3RyeTogZmFpbGVkIHRvIG9wZW4gdHVuZXJzIHJlZ2lzdHJ5IGtleSAoJWxkKVxuIiwgKGxvbmcpcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJRFdPUkQgaW5kZXggPSAwOworCXdoaWxlICgxKSB7CisJCS8qIE5leHQgdHVuZXIgZGV2aWNlLiAqLworCQl3Y2hhcl90IHdkZXZpY2VfbmFtZVszMl07CisJCURXT1JEIHNpemUgPSBzaXplb2Yod2RldmljZV9uYW1lKTsKKwkJcmV0ID0gUmVnRW51bUtleUV4KHR1bmVyc19rZXksIGluZGV4KyssIHdkZXZpY2VfbmFtZSwgJnNpemUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCQlpZiAocmV0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ2hlY2sgZGV2aWNlIGNvbmZpZ3VhdGlvbi4gKi8KKwkJSEtFWSBkZXZpY2Vfa2V5OworCQlyZXQgPSBSZWdPcGVuS2V5RXgodHVuZXJzX2tleSwgd2RldmljZV9uYW1lLCAwLCBLRVlfUVVFUllfVkFMVUUsICZkZXZpY2Vfa2V5KTsKKwkJaWYgKHJldCAhPSBFUlJPUl9TVUNDRVNTKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkcy0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9sb2FkX2Zyb21fd2luZG93c19yZWdpc3RyeTogZmFpbGVkIHRvIG9wZW4gcmVnaXN0cnkga2V5IGZvciAlUyAoJWxkKVxuIiwgd2RldmljZV9uYW1lLCAobG9uZylyZXQpOworCQkJY29udGludWU7CisJCX0KKworCQl3Y2hhcl90IHdzb3VyY2VfdGVzdFszMl07CisJCXNpemUgPSBzaXplb2Yod3NvdXJjZV90ZXN0KTsKKwkJaWYgKFJlZ1F1ZXJ5VmFsdWVFeChkZXZpY2Vfa2V5LCBMIlNvdXJjZSIsIE5VTEwsIE5VTEwsIChMUEJZVEUpJndzb3VyY2VfdGVzdCwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MpIHsKKwkJCXdzcHJpbnRmKHdzb3VyY2VfdGVzdCwgTCJVbmtub3duIik7CisJCX0KKworCQlSZWdDbG9zZUtleShkZXZpY2Vfa2V5KTsKKworCQlpZiAoX3djc2ljbXAod3NvdXJjZV90ZXN0LCB3c291cmNlKSAhPSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENyZWF0ZSBhbmQgYWRkIGRldmljZS4gKi8KKwkJY2hhciBkZXZpY2VfbmFtZVszMl07CisJCXNwcmludGYoZGV2aWNlX25hbWUsICIlUyIsIHdkZXZpY2VfbmFtZSk7CisKKwkJc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQgPSBoZGhvbWVydW5fZGV2aWNlX2NyZWF0ZV9mcm9tX3N0cihkZXZpY2VfbmFtZSwgaGRzLT5kYmcpOworCQlpZiAoIWhkKSB7CisJCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkcy0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9sb2FkX2Zyb21fd2luZG93c19yZWdpc3RyeTogaW52YWxpZCBkZXZpY2UgbmFtZSAnJXMnIC8gZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugb2JqZWN0XG4iLCBkZXZpY2VfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfYWRkX2RldmljZShoZHMsIGhkKTsKKwl9CisKKwlSZWdDbG9zZUtleSh0dW5lcnNfa2V5KTsKKwlyZXR1cm4gKGludCloZHMtPmhkX2NvdW50OworfQorI2VuZGlmCisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9jaG9vc2VfdGVzdChzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICpoZHMsIHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKnRlc3RfaGQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGhkaG9tZXJ1bl9kZXZpY2VfZ2V0X25hbWUodGVzdF9oZCk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gYXF1aXJlIGxvY2suCisJICovCisJY2hhciAqZXJyb3I7CisJaW50IHJldCA9IGhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9yZXF1ZXN0KHRlc3RfaGQsICZlcnJvcik7CisJaWYgKHJldCA+IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBjaG9zZW5cbiIsIG5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBjb21tdW5pY2F0aW9uIGVycm9yXG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qCisJICogSW4gdXNlIC0gY2hlY2sgdGFyZ2V0LgorCSAqLworCWNoYXIgKnRhcmdldDsKKwlyZXQgPSBoZGhvbWVydW5fZGV2aWNlX2dldF90dW5lcl90YXJnZXQodGVzdF9oZCwgJnRhcmdldCk7CisJaWYgKHJldCA8IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBjb21tdW5pY2F0aW9uIGVycm9yXG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBpbiB1c2UsIGZhaWxlZCB0byByZWFkIHRhcmdldFxuIiwgbmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwljaGFyICpwdHIgPSBzdHJzdHIodGFyZ2V0LCAiLy8iKTsKKwlpZiAocHRyKSB7CisJCXRhcmdldCA9IHB0ciArIDI7CisJfQorCXB0ciA9IHN0cmNocih0YXJnZXQsICcgJyk7CisJaWYgKHB0cikgeworCQkqcHRyID0gMDsKKwl9CisKKwl1bnNpZ25lZCBsb25nIGFbNF07CisJdW5zaWduZWQgbG9uZyB0YXJnZXRfcG9ydDsKKwlpZiAoc3NjYW5mKHRhcmdldCwgIiVsdS4lbHUuJWx1LiVsdTolbHUiLCAmYVswXSwgJmFbMV0sICZhWzJdLCAmYVszXSwgJnRhcmdldF9wb3J0KSAhPSA1KSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0OiBkZXZpY2UgJXMgaW4gdXNlLCBubyB0YXJnZXQgc2V0ICglcylcbiIsIG5hbWUsIHRhcmdldCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl1aW50MzJfdCB0YXJnZXRfaXAgPSAodWludDMyX3QpKChhWzBdIDw8IDI0KSB8IChhWzFdIDw8IDE2KSB8IChhWzJdIDw8IDgpIHwgKGFbM10gPDwgMCkpOworCXVpbnQzMl90IGxvY2FsX2lwID0gaGRob21lcnVuX2RldmljZV9nZXRfbG9jYWxfbWFjaGluZV9hZGRyKHRlc3RfaGQpOworCWlmICh0YXJnZXRfaXAgIT0gbG9jYWxfaXApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBpbiB1c2UgYnkgJXNcbiIsIG5hbWUsIHRhcmdldCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKgorCSAqIFRlc3QgbG9jYWwgcG9ydC4KKwkgKi8KKwloZGhvbWVydW5fc29ja190IHRlc3Rfc29jayA9IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV91ZHAoKTsKKwlpZiAodGVzdF9zb2NrID09IEhESE9NRVJVTl9TT0NLX0lOVkFMSUQpIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBpbiB1c2UsIGZhaWxlZCB0byBjcmVhdGUgdGVzdCBzb2NrXG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWJvb2xfdCBpbnVzZSA9IChoZGhvbWVydW5fc29ja19iaW5kKHRlc3Rfc29jaywgSU5BRERSX0FOWSwgKHVpbnQxNl90KXRhcmdldF9wb3J0LCBGQUxTRSkgPT0gRkFMU0UpOworCWhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3kodGVzdF9zb2NrKTsKKworCWlmIChpbnVzZSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkcy0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9jaG9vc2VfdGVzdDogZGV2aWNlICVzIGluIHVzZSBieSBsb2NhbCBtYWNoaW5lXG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qCisJICogRGVhZCBsb2NhbCB0YXJnZXQsIGZvcmNlIGNsZWFyIGxvY2suCisJICovCisJcmV0ID0gaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X2ZvcmNlKHRlc3RfaGQpOworCWlmIChyZXQgPCAwKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0OiBkZXZpY2UgJXMgY29tbXVuaWNhdGlvbiBlcnJvclxuIiwgbmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKHJldCA9PSAwKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0OiBkZXZpY2UgJXMgaW4gdXNlIGJ5IGxvY2FsIG1hY2hpbmUsIGRlYWQgdGFyZ2V0LCBmYWlsZWQgdG8gZm9yY2UgcmVsZWFzZSBsb2Nra2V5XG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0OiBkZXZpY2UgJXMgaW4gdXNlIGJ5IGxvY2FsIG1hY2hpbmUsIGRlYWQgdGFyZ2V0LCBsb2Nra2V5IGZvcmNlIHN1Y2Nlc3NmdWxcbiIsIG5hbWUpOworCisJLyoKKwkgKiBBdHRlbXB0IHRvIGFxdWlyZSBsb2NrLgorCSAqLworCXJldCA9IGhkaG9tZXJ1bl9kZXZpY2VfdHVuZXJfbG9ja2tleV9yZXF1ZXN0KHRlc3RfaGQsICZlcnJvcik7CisJaWYgKHJldCA+IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBjaG9zZW5cbiIsIG5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJaGRob21lcnVuX2RlYnVnX3ByaW50ZihoZHMtPmRiZywgImhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3Q6IGRldmljZSAlcyBjb21tdW5pY2F0aW9uIGVycm9yXG4iLCBuYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoaGRzLT5kYmcsICJoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0OiBkZXZpY2UgJXMgc3RpbGwgaW4gdXNlIGFmdGVyIGxvY2trZXkgZm9yY2UgKCVzKVxuIiwgbmFtZSwgZXJyb3IpOworCXJldHVybiBGQUxTRTsKK30KKworc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9jaG9vc2VfYW5kX2xvY2soc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzLCBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpwcmVmZXJlZCkKK3sKKwkvKiBUZXN0IHByZWZlcmVkIGRldmljZSBmaXJzdC4gKi8KKwlpZiAocHJlZmVyZWQpIHsKKwkJaWYgKGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX3Rlc3QoaGRzLCBwcmVmZXJlZCkpIHsKKwkJCXJldHVybiBwcmVmZXJlZDsKKwkJfQorCX0KKworCS8qIFRlc3Qgb3RoZXIgdHVuZXJzLiAqLworCXNpemVfdCBpbmRleDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBoZHMtPmhkX2NvdW50OyBpbmRleCsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmVudHJ5ID0gaGRzLT5oZF9saXN0W2luZGV4XTsKKwkJaWYgKGVudHJ5ID09IHByZWZlcmVkKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV90ZXN0KGhkcywgZW50cnkpKSB7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwl9CisKKwloZGhvbWVydW5fZGVidWdfcHJpbnRmKGhkcy0+ZGJnLCAiaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9jaG9vc2VfYW5kX2xvY2s6IG5vIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yLmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2RldmljZV9zZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmMzU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2RldmljZV9zZWxlY3Rvci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yLmgKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwOSBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZSBhIGRldmljZSBzZWxlY3RvciBvYmplY3QgZm9yIHVzZSB3aXRoIGR5bmFtaWMgdHVuZXIgYWxsb2NhdGlvbiBzdXBwb3J0LgorICogQWxsIHR1bmVycyByZWdpc3RlcmVkIHdpdGggYSBzcGVjaWZpYyBkZXZpY2Ugc2VsZWN0b3IgaW5zdGFuY2UgbXVzdCBoYXZlIHRoZSBzYW1lIHNpZ25hbCBzb3VyY2UuCisgKiBUaGUgZGJnIHBhcmFtZXRlciBtYXkgYmUgbnVsbC4KKyAqLworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9jcmVhdGUoc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzLCBib29sX3QgZGVzdHJveV9kZXZpY2VzKTsKKworLyoKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGRldmljZXMgaW4gdGhlIGxpc3QuCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2dldF9kZXZpY2VfY291bnQoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzKTsKKworLyoKKyAqIFBvcHVsYXRlIGRldmljZSBzZWxlY3RvciB3aXRoIGRldmljZXMgZnJvbSBnaXZlbiBzb3VyY2UuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBwb3B1bGF0ZWQuCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2xvYWRfZnJvbV9maWxlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgY2hhciAqZmlsZW5hbWUpOworI2lmIGRlZmluZWQoX19XSU5ET1dTX18pCitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9sb2FkX2Zyb21fd2luZG93c19yZWdpc3RyeShzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl90ICpoZHMsIHdjaGFyX3QgKndzb3VyY2UpOworI2VuZGlmCisKKy8qCisgKiBBZGQvcmVtb3ZlIGEgZGV2aWNlIGZyb20gdGhlIHNlbGVjdG9yIGxpc3QuCisgKi8KK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2RldmljZV9zZWxlY3Rvcl9hZGRfZGV2aWNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqaGQpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfdCAqaGRzLCBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZCk7CisKKy8qCisgKiBGaW5kIGEgZGV2aWNlIGluIHRoZSBzZWxlY3RvciBsaXN0LgorICovCitleHRlcm4gTElCVFlQRSBzdHJ1Y3QgaGRob21lcnVuX2RldmljZV90ICpoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2ZpbmRfZGV2aWNlKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgdWludDMyX3QgZGV2aWNlX2lkLCB1bnNpZ25lZCBpbnQgdHVuZXJfaW5kZXgpOworCisvKgorICogU2VsZWN0IGFuZCBsb2NrIGFuIGF2YWlsYWJsZSBkZXZpY2UuCisgKiBJZiBub3QgbnVsbCwgcHJlZmVyZW5jZSB3aWxsIGJlIGdpdmVuIHRvIHRoZSBwcmVmZXJlZCBkZXZpY2Ugc3BlY2lmaWVkLgorICogVGhlIGRldmljZSByZXNvdXJjZSBsb2NrIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZCBieQorICogY2FsbGluZyBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZSgpLgorICoKKyAqIFJlY29tbWVuZGVkIGNoYW5uZWwgY2hhbmdlIGxvZ2ljOgorICoKKyAqIFN0YXJ0IChpbmFjdGl2ZSAtPiBhY3RpdmUpOgorICogLSBDYWxsIGhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX2FuZF9sb2NrKCkgdG8gY2hvb3NlIGFuZCBsb2NrIGFuIGF2YWlsYWJsZSB0dW5lci4KKyAqIAorICogU3RvcCAoYWN0aXZlIC0+IGluYWN0aXZlKToKKyAqIC0gQ2FsbCBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZSgpIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlIGxvY2sgYW5kIGFsbG93IHRoZSB0dW5lcgorICogICB0byBiZSBhbGxvY2F0ZWQgYnkgb3RoZXIgY29tcHV0ZXJzLgorICoKKyAqIENoYW5uZWwgY2hhbmdlIChhY3RpdmUgLT4gYWN0aXZlKToKKyAqIC0gSWYgdGhlIG5ldyBjaGFubmVsIGhhcyBhIGRpZmZlcmVudCBzaWduYWwgc291cmNlIHRoZW4gY2FsbCBoZGhvbWVydW5fZGV2aWNlX3R1bmVyX2xvY2trZXlfcmVsZWFzZSgpCisgKiAgIHRvIHJlbGVhc2UgdGhlIGxvY2sgb24gdGhlIHR1bmVyIHBsYXlpbmcgdGhlIHByZXZpb3VzIGNoYW5uZWwsIHRoZW4gY2FsbAorICogICBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV9hbmRfbG9jaygpIHRvIGNob29zZSBhbmQgbG9jayBhbiBhdmFpbGFibGUgdHVuZXIuCisgKiAtIElmIHRoZSBuZXcgY2hhbm5lbCBoYXMgdGhlIHNhbWUgc2lnbmFsIHNvdXJjZSB0aGVuIGNhbGwgaGRob21lcnVuX2RldmljZV90dW5lcl9sb2Nra2V5X3JlcXVlc3QoKQorICogICB0byByZWZyZXNoIHRoZSBsb2NrLiBJZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzIHRoZW4gdGhlIHNhbWUgZGV2aWNlIGNhbiBiZSB1c2VkLiBJZiB0aGlzIGZ1Y250aW9uIGZhaWxzCisgKiAgIHRoZW4gY2FsbCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX2Nob29zZV9hbmRfbG9jaygpIHRvIGNob29zZSBhbmQgbG9jayBhbiBhdmFpbGFibGUgdHVuZXIuCisgKi8KK2V4dGVybiBMSUJUWVBFIHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3QgKmhkaG9tZXJ1bl9kZXZpY2Vfc2VsZWN0b3JfY2hvb3NlX2FuZF9sb2NrKHN0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3NlbGVjdG9yX3QgKmhkcywgc3RydWN0IGhkaG9tZXJ1bl9kZXZpY2VfdCAqcHJlZmVyZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kaXNjb3Zlci5jIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kaXNjb3Zlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAzMDcwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2Rpc2NvdmVyLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBoZGhvbWVydW5fZGlzY292ZXIuYworICoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaGRob21lcnVuLmgiCisKKyNkZWZpbmUgSERIT01FUlVOX0RJU09DVkVSX01BWF9TT0NLX0NPVU5UIDE2CisKK3N0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190IHsKKwloZGhvbWVydW5fc29ja190IHNvY2s7CisJYm9vbF90IGRldGVjdGVkOworCXVpbnQzMl90IGxvY2FsX2lwOworCXVpbnQzMl90IHN1Ym5ldF9tYXNrOworfTsKKworc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90IHsKKwlzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3NvY2tfdCBzb2Nrc1tIREhPTUVSVU5fRElTT0NWRVJfTUFYX1NPQ0tfQ09VTlRdOworCXVuc2lnbmVkIGludCBzb2NrX2NvdW50OworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgdHhfcGt0OworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgcnhfcGt0OworfTsKKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja19hZGQoc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90ICpkcywgdWludDMyX3QgbG9jYWxfaXAsIHVpbnQzMl90IHN1Ym5ldF9tYXNrKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDE7IGkgPCBkcy0+c29ja19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190ICpkc3MgPSAmZHMtPnNvY2tzW2ldOworCisJCWlmICgoZHNzLT5sb2NhbF9pcCA9PSBsb2NhbF9pcCkgJiYgKGRzcy0+c3VibmV0X21hc2sgPT0gc3VibmV0X21hc2spKSB7CisJCQlkc3MtPmRldGVjdGVkID0gVFJVRTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJfQorCisJaWYgKGRzLT5zb2NrX2NvdW50ID49IEhESE9NRVJVTl9ESVNPQ1ZFUl9NQVhfU09DS19DT1VOVCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogQ3JlYXRlIHNvY2tldC4gKi8KKwloZGhvbWVydW5fc29ja190IHNvY2sgPSBoZGhvbWVydW5fc29ja19jcmVhdGVfdWRwKCk7CisJaWYgKHNvY2sgPT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogQmluZCBzb2NrZXQuICovCisJaWYgKCFoZGhvbWVydW5fc29ja19iaW5kKHNvY2ssIGxvY2FsX2lwLCAwLCBGQUxTRSkpIHsKKwkJaGRob21lcnVuX3NvY2tfZGVzdHJveShzb2NrKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFdyaXRlIHNvY2sgZW50cnkuICovCisJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcyA9ICZkcy0+c29ja3NbZHMtPnNvY2tfY291bnQrK107CisJZHNzLT5zb2NrID0gc29jazsKKwlkc3MtPmRldGVjdGVkID0gVFJVRTsKKwlkc3MtPmxvY2FsX2lwID0gbG9jYWxfaXA7CisJZHNzLT5zdWJuZXRfbWFzayA9IHN1Ym5ldF9tYXNrOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqaGRob21lcnVuX2Rpc2NvdmVyX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMgPSAoc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3QpKTsKKwlpZiAoIWRzKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIENyZWF0ZSBhIHJvdXRhYmxlIHNvY2tldCAoYWx3YXlzIGZpcnN0IGVudHJ5KS4gKi8KKwlpZiAoIWhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX2FkZChkcywgMCwgMCkpIHsKKwkJZnJlZShkcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIGRzOworfQorCit2b2lkIGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXN0cm95KHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGRzLT5zb2NrX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcyA9ICZkcy0+c29ja3NbaV07CisJCWhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3koZHNzLT5zb2NrKTsKKwl9CisKKwlmcmVlKGRzKTsKK30KKworc3RhdGljIHZvaWQgaGRob21lcnVuX2Rpc2NvdmVyX3NvY2tfZGV0ZWN0KHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMTsgaSA8IGRzLT5zb2NrX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcyA9ICZkcy0+c29ja3NbaV07CisJCWRzcy0+ZGV0ZWN0ZWQgPSBGQUxTRTsKKwl9CisKKwlzdHJ1Y3QgaGRob21lcnVuX2xvY2FsX2lwX2luZm9fdCBpcF9pbmZvX2xpc3RbSERIT01FUlVOX0RJU09DVkVSX01BWF9TT0NLX0NPVU5UXTsKKwlpbnQgY291bnQgPSBoZGhvbWVydW5fbG9jYWxfaXBfaW5mbyhpcF9pbmZvX2xpc3QsIEhESE9NRVJVTl9ESVNPQ1ZFUl9NQVhfU09DS19DT1VOVCk7CisJaWYgKGNvdW50IDwgMCkgeworCQljb3VudCA9IDA7CisJfQorCisJaW50IGluZGV4OworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fbG9jYWxfaXBfaW5mb190ICppcF9pbmZvID0gJmlwX2luZm9fbGlzdFtpbmRleF07CisJCWhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX2FkZChkcywgaXBfaW5mby0+aXBfYWRkciwgaXBfaW5mby0+c3VibmV0X21hc2spOworCX0KKworCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190ICpzcmMgPSAmZHMtPnNvY2tzWzFdOworCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190ICpkc3QgPSAmZHMtPnNvY2tzWzFdOworCWNvdW50ID0gMTsKKwlmb3IgKGkgPSAxOyBpIDwgZHMtPnNvY2tfY291bnQ7IGkrKykgeworCQlpZiAoIXNyYy0+ZGV0ZWN0ZWQpIHsKKwkJCWhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3koc3JjLT5zb2NrKTsKKwkJCXNyYysrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGRzdCAhPSBzcmMpIHsKKwkJCSpkc3QgPSAqc3JjOworCQl9CisJCXNyYysrOworCQlkc3QrKzsKKwkJY291bnQrKzsKKwl9CisKKwlkcy0+c29ja19jb3VudCA9IGNvdW50OworfQorCitzdGF0aWMgYm9vbF90IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zZW5kX2ludGVybmFsKHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMsIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190ICpkc3MsIHVpbnQzMl90IHRhcmdldF9pcCwgdWludDMyX3QgZGV2aWNlX3R5cGUsIHVpbnQzMl90IGRldmljZV9pZCkKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICp0eF9wa3QgPSAmZHMtPnR4X3BrdDsKKwloZGhvbWVydW5fcGt0X3Jlc2V0KHR4X3BrdCk7CisKKwloZGhvbWVydW5fcGt0X3dyaXRlX3U4KHR4X3BrdCwgSERIT01FUlVOX1RBR19ERVZJQ0VfVFlQRSk7CisJaGRob21lcnVuX3BrdF93cml0ZV92YXJfbGVuZ3RoKHR4X3BrdCwgNCk7CisJaGRob21lcnVuX3BrdF93cml0ZV91MzIodHhfcGt0LCBkZXZpY2VfdHlwZSk7CisJaGRob21lcnVuX3BrdF93cml0ZV91OCh0eF9wa3QsIEhESE9NRVJVTl9UQUdfREVWSUNFX0lEKTsKKwloZGhvbWVydW5fcGt0X3dyaXRlX3Zhcl9sZW5ndGgodHhfcGt0LCA0KTsKKwloZGhvbWVydW5fcGt0X3dyaXRlX3UzMih0eF9wa3QsIGRldmljZV9pZCk7CisJaGRob21lcnVuX3BrdF9zZWFsX2ZyYW1lKHR4X3BrdCwgSERIT01FUlVOX1RZUEVfRElTQ09WRVJfUkVRKTsKKworCXJldHVybiBoZGhvbWVydW5fc29ja19zZW5kdG8oZHNzLT5zb2NrLCB0YXJnZXRfaXAsIEhESE9NRVJVTl9ESVNDT1ZFUl9VRFBfUE9SVCwgdHhfcGt0LT5zdGFydCwgdHhfcGt0LT5lbmQgLSB0eF9wa3QtPnN0YXJ0LCAwKTsKK30KKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fZGlzY292ZXJfc2VuZF93aWxkY2FyZF9pcChzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3QgKmRzLCB1aW50MzJfdCBkZXZpY2VfdHlwZSwgdWludDMyX3QgZGV2aWNlX2lkKQoreworCWJvb2xfdCByZXN1bHQgPSBGQUxTRTsKKworCS8qCisJICogU2VuZCBzdWJuZXQgYnJvYWRjYXN0IHVzaW5nIGVhY2ggbG9jYWwgaXAgc29ja2V0LgorCSAqIFRoaXMgd2lsbCB3b3JrIHdpdGggbXVsdGlwbGUgc2VwYXJhdGUgMTY5LjI1NC54LnggaW50ZXJmYWNlcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAxOyBpIDwgZHMtPnNvY2tfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3NvY2tfdCAqZHNzID0gJmRzLT5zb2Nrc1tpXTsKKwkJdWludDMyX3QgdGFyZ2V0X2lwID0gZHNzLT5sb2NhbF9pcCB8IH5kc3MtPnN1Ym5ldF9tYXNrOworCQlyZXN1bHQgfD0gaGRob21lcnVuX2Rpc2NvdmVyX3NlbmRfaW50ZXJuYWwoZHMsIGRzcywgdGFyZ2V0X2lwLCBkZXZpY2VfdHlwZSwgZGV2aWNlX2lkKTsKKwl9CisKKwkvKgorCSAqIElmIG5vIGxvY2FsIGlwIHNvY2tldHMgdGhlbiBmYWxsIGJhY2sgdG8gc2VuZGluZyBhIGdsb2JhbCBicm9hZGNhc3QgbGV0dGluZyB0aGUgT1MgY2hvb3NlIHRoZSBpbnRlcmZhY2UuCisJICovCisJaWYgKCFyZXN1bHQpIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcyA9ICZkcy0+c29ja3NbMF07CisJCXJlc3VsdCA9IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zZW5kX2ludGVybmFsKGRzLCBkc3MsIDB4RkZGRkZGRkYsIGRldmljZV90eXBlLCBkZXZpY2VfaWQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX2Rpc2NvdmVyX3NlbmRfdGFyZ2V0X2lwKHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMsIHVpbnQzMl90IHRhcmdldF9pcCwgdWludDMyX3QgZGV2aWNlX3R5cGUsIHVpbnQzMl90IGRldmljZV9pZCkKK3sKKwlib29sX3QgcmVzdWx0ID0gRkFMU0U7CisKKwkvKgorCSAqIFNlbmQgdGFyZ2V0ZWQgcGFja2V0IGZyb20gYW55IGxvY2FsIGlwIHRoYXQgaXMgaW4gdGhlIHNhbWUgc3VibmV0LgorCSAqIFRoaXMgd2lsbCB3b3JrIHdpdGggbXVsdGlwbGUgc2VwYXJhdGUgMTY5LjI1NC54LnggaW50ZXJmYWNlcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAxOyBpIDwgZHMtPnNvY2tfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3NvY2tfdCAqZHNzID0gJmRzLT5zb2Nrc1tpXTsKKwkJaWYgKCh0YXJnZXRfaXAgJiBkc3MtPnN1Ym5ldF9tYXNrKSAhPSAoZHNzLT5sb2NhbF9pcCAmIGRzcy0+c3VibmV0X21hc2spKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlc3VsdCB8PSBoZGhvbWVydW5fZGlzY292ZXJfc2VuZF9pbnRlcm5hbChkcywgZHNzLCB0YXJnZXRfaXAsIGRldmljZV90eXBlLCBkZXZpY2VfaWQpOworCX0KKworCS8qCisJICogSWYgdGFyZ2V0IElQIGRvZXMgbm90IG1hdGNoIGEgbG9jYWwgc3VibmV0IHRoZW4gZmFsbCBiYWNrIHRvIGxldHRpbmcgdGhlIE9TIGNob29zZSB0aGUgZ2F0ZXdheSBpbnRlcmZhY2UuCisJICovCisJaWYgKCFyZXN1bHQpIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcyA9ICZkcy0+c29ja3NbMF07CisJCXJlc3VsdCA9IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zZW5kX2ludGVybmFsKGRzLCBkc3MsIHRhcmdldF9pcCwgZGV2aWNlX3R5cGUsIGRldmljZV9pZCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fZGlzY292ZXJfc2VuZChzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3QgKmRzLCB1aW50MzJfdCB0YXJnZXRfaXAsIHVpbnQzMl90IGRldmljZV90eXBlLCB1aW50MzJfdCBkZXZpY2VfaWQpCit7CisJaWYgKHRhcmdldF9pcCA9PSAwKSB7CisJCXJldHVybiBoZGhvbWVydW5fZGlzY292ZXJfc2VuZF93aWxkY2FyZF9pcChkcywgZGV2aWNlX3R5cGUsIGRldmljZV9pZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGhkaG9tZXJ1bl9kaXNjb3Zlcl9zZW5kX3RhcmdldF9pcChkcywgdGFyZ2V0X2lwLCBkZXZpY2VfdHlwZSwgZGV2aWNlX2lkKTsKKwl9Cit9CisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX2Rpc2NvdmVyX3JlY3ZfaW50ZXJuYWwoc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90ICpkcywgc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX3QgKmRzcywgc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCAqcmVzdWx0KQoreworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnJ4X3BrdCA9ICZkcy0+cnhfcGt0OworCWhkaG9tZXJ1bl9wa3RfcmVzZXQocnhfcGt0KTsKKworCXVpbnQzMl90IHJlbW90ZV9hZGRyOworCXVpbnQxNl90IHJlbW90ZV9wb3J0OworCXNpemVfdCBsZW5ndGggPSByeF9wa3QtPmxpbWl0IC0gcnhfcGt0LT5lbmQ7CisJaWYgKCFoZGhvbWVydW5fc29ja19yZWN2ZnJvbShkc3MtPnNvY2ssICZyZW1vdGVfYWRkciwgJnJlbW90ZV9wb3J0LCByeF9wa3QtPmVuZCwgJmxlbmd0aCwgMCkpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJ4X3BrdC0+ZW5kICs9IGxlbmd0aDsKKworCXVpbnQxNl90IHR5cGU7CisJaWYgKGhkaG9tZXJ1bl9wa3Rfb3Blbl9mcmFtZShyeF9wa3QsICZ0eXBlKSA8PSAwKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKHR5cGUgIT0gSERIT01FUlVOX1RZUEVfRElTQ09WRVJfUlBZKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXN1bHQtPmlwX2FkZHIgPSByZW1vdGVfYWRkcjsKKwlyZXN1bHQtPmRldmljZV90eXBlID0gMDsKKwlyZXN1bHQtPmRldmljZV9pZCA9IDA7CisJcmVzdWx0LT50dW5lcl9jb3VudCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQl1aW50OF90IHRhZzsKKwkJc2l6ZV90IGxlbjsKKwkJdWludDhfdCAqbmV4dCA9IGhkaG9tZXJ1bl9wa3RfcmVhZF90bHYocnhfcGt0LCAmdGFnLCAmbGVuKTsKKwkJaWYgKCFuZXh0KSB7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgSERIT01FUlVOX1RBR19ERVZJQ0VfVFlQRToKKwkJCWlmIChsZW4gIT0gNCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJcmVzdWx0LT5kZXZpY2VfdHlwZSA9IGhkaG9tZXJ1bl9wa3RfcmVhZF91MzIocnhfcGt0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSERIT01FUlVOX1RBR19ERVZJQ0VfSUQ6CisJCQlpZiAobGVuICE9IDQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJlc3VsdC0+ZGV2aWNlX2lkID0gaGRob21lcnVuX3BrdF9yZWFkX3UzMihyeF9wa3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBIREhPTUVSVU5fVEFHX1RVTkVSX0NPVU5UOgorCQkJaWYgKGxlbiAhPSAxKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXN1bHQtPnR1bmVyX2NvdW50ID0gaGRob21lcnVuX3BrdF9yZWFkX3U4KHJ4X3BrdCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyeF9wa3QtPnBvcyA9IG5leHQ7CisJfQorCisJLyogRml4dXAgZm9yIG9sZCBmaXJtd2FyZS4gKi8KKwlpZiAocmVzdWx0LT50dW5lcl9jb3VudCA9PSAwKSB7CisJCXN3aXRjaCAocmVzdWx0LT5kZXZpY2VfaWQgPj4gMjApIHsKKwkJY2FzZSAweDEwMjoKKwkJCXJlc3VsdC0+dHVuZXJfY291bnQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDEwMDoKKwkJY2FzZSAweDEwMToKKwkJY2FzZSAweDEyMToKKwkJCXJlc3VsdC0+dHVuZXJfY291bnQgPSAyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX2Rpc2NvdmVyX3JlY3Yoc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90ICpkcywgc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCAqcmVzdWx0KQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBkcy0+c29ja19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfc29ja190ICpkc3MgPSAmZHMtPnNvY2tzW2ldOworCisJCWlmIChoZGhvbWVydW5fZGlzY292ZXJfcmVjdl9pbnRlcm5hbChkcywgZHNzLCByZXN1bHQpKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgKmhkaG9tZXJ1bl9kaXNjb3Zlcl9maW5kX2luX2xpc3Qoc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCByZXN1bHRfbGlzdFtdLCBpbnQgY291bnQsIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgKmxvb2t1cCkKK3sKKwlpbnQgaW5kZXg7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKwkJc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCAqZW50cnkgPSAmcmVzdWx0X2xpc3RbaW5kZXhdOworCQlpZiAobWVtY21wKGxvb2t1cCwgZW50cnksIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX2RldmljZV90KSkgPT0gMCkgeworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoZGhvbWVydW5fZGlzY292ZXJfZmluZF9kZXZpY2VzKHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMsIHVpbnQzMl90IHRhcmdldF9pcCwgdWludDMyX3QgZGV2aWNlX3R5cGUsIHVpbnQzMl90IGRldmljZV9pZCwgc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCByZXN1bHRfbGlzdFtdLCBpbnQgbWF4X2NvdW50KQoreworCWhkaG9tZXJ1bl9kaXNjb3Zlcl9zb2NrX2RldGVjdChkcyk7CisKKwlpbnQgY291bnQgPSAwOworCWludCBhdHRlbXB0OworCWZvciAoYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyOyBhdHRlbXB0KyspIHsKKwkJaWYgKCFoZGhvbWVydW5fZGlzY292ZXJfc2VuZChkcywgdGFyZ2V0X2lwLCBkZXZpY2VfdHlwZSwgZGV2aWNlX2lkKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJdWludDY0X3QgdGltZW91dCA9IGdldGN1cnJlbnR0aW1lKCkgKyAyMDA7CisJCXdoaWxlICgxKSB7CisJCQlzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX2RldmljZV90ICpyZXN1bHQgPSAmcmVzdWx0X2xpc3RbY291bnRdOworCQkJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QpKTsKKworCQkJaWYgKCFoZGhvbWVydW5fZGlzY292ZXJfcmVjdihkcywgcmVzdWx0KSkgeworCQkJCWlmIChnZXRjdXJyZW50dGltZSgpID49IHRpbWVvdXQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1zbGVlcF9hcHByb3goMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBGaWx0ZXIuICovCisJCQlpZiAoZGV2aWNlX3R5cGUgIT0gSERIT01FUlVOX0RFVklDRV9UWVBFX1dJTERDQVJEKSB7CisJCQkJaWYgKGRldmljZV90eXBlICE9IHJlc3VsdC0+ZGV2aWNlX3R5cGUpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKGRldmljZV9pZCAhPSBIREhPTUVSVU5fREVWSUNFX0lEX1dJTERDQVJEKSB7CisJCQkJaWYgKGRldmljZV9pZCAhPSByZXN1bHQtPmRldmljZV9pZCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEVuc3VyZSBub3QgYWxyZWFkeSBpbiBsaXN0LiAqLworCQkJaWYgKGhkaG9tZXJ1bl9kaXNjb3Zlcl9maW5kX2luX2xpc3QocmVzdWx0X2xpc3QsIGNvdW50LCByZXN1bHQpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEFkZCB0byBsaXN0LiAqLworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+PSBtYXhfY291bnQpIHsKKwkJCQlyZXR1cm4gY291bnQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBoZGhvbWVydW5fZGlzY292ZXJfZmluZF9kZXZpY2VzX2N1c3RvbSh1aW50MzJfdCB0YXJnZXRfaXAsIHVpbnQzMl90IGRldmljZV90eXBlLCB1aW50MzJfdCBkZXZpY2VfaWQsIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgcmVzdWx0X2xpc3RbXSwgaW50IG1heF9jb3VudCkKK3sKKwlpZiAoaGRob21lcnVuX2Rpc2NvdmVyX2lzX2lwX211bHRpY2FzdCh0YXJnZXRfaXApKSB7CisJCXJldHVybiAwOworCX0KKworCXN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqZHMgPSBoZGhvbWVydW5fZGlzY292ZXJfY3JlYXRlKCk7CisJaWYgKCFkcykgeworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IHJldCA9IGhkaG9tZXJ1bl9kaXNjb3Zlcl9maW5kX2RldmljZXMoZHMsIHRhcmdldF9pcCwgZGV2aWNlX3R5cGUsIGRldmljZV9pZCwgcmVzdWx0X2xpc3QsIG1heF9jb3VudCk7CisKKwloZGhvbWVydW5fZGlzY292ZXJfZGVzdHJveShkcyk7CisJcmV0dXJuIHJldDsKK30KKworYm9vbF90IGhkaG9tZXJ1bl9kaXNjb3Zlcl92YWxpZGF0ZV9kZXZpY2VfaWQodWludDMyX3QgZGV2aWNlX2lkKQoreworCXN0YXRpYyB1aW50MzJfdCBsb29rdXBfdGFibGVbMTZdID0gezB4QSwgMHg1LCAweEYsIDB4NiwgMHg3LCAweEMsIDB4MSwgMHhCLCAweDksIDB4MiwgMHg4LCAweEQsIDB4NCwgMHgzLCAweEUsIDB4MH07CisKKwl1aW50MzJfdCBjaGVja3N1bSA9IDA7CisKKwljaGVja3N1bSBePSBsb29rdXBfdGFibGVbKGRldmljZV9pZCA+PiAyOCkgJiAweDBGXTsKKwljaGVja3N1bSBePSAoZGV2aWNlX2lkID4+IDI0KSAmIDB4MEY7CisJY2hlY2tzdW0gXj0gbG9va3VwX3RhYmxlWyhkZXZpY2VfaWQgPj4gMjApICYgMHgwRl07CisJY2hlY2tzdW0gXj0gKGRldmljZV9pZCA+PiAxNikgJiAweDBGOworCWNoZWNrc3VtIF49IGxvb2t1cF90YWJsZVsoZGV2aWNlX2lkID4+IDEyKSAmIDB4MEZdOworCWNoZWNrc3VtIF49IChkZXZpY2VfaWQgPj4gOCkgJiAweDBGOworCWNoZWNrc3VtIF49IGxvb2t1cF90YWJsZVsoZGV2aWNlX2lkID4+IDQpICYgMHgwRl07CisJY2hlY2tzdW0gXj0gKGRldmljZV9pZCA+PiAwKSAmIDB4MEY7CisKKwlyZXR1cm4gKGNoZWNrc3VtID09IDApOworfQorCitib29sX3QgaGRob21lcnVuX2Rpc2NvdmVyX2lzX2lwX211bHRpY2FzdCh1aW50MzJfdCBpcF9hZGRyKQoreworCXJldHVybiAoaXBfYWRkciA+PSAweEUwMDAwMDAwKSAmJiAoaXBfYWRkciA8IDB4RjAwMDAwMDApOworfQpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kaXNjb3Zlci5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9kaXNjb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmMGQ5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX2Rpc2NvdmVyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIGhkaG9tZXJ1bl9kaXNjb3Zlci5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAwNyBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgeworCXVpbnQzMl90IGlwX2FkZHI7CisJdWludDMyX3QgZGV2aWNlX3R5cGU7CisJdWludDMyX3QgZGV2aWNlX2lkOworCXVpbnQ4X3QgdHVuZXJfY291bnQ7Cit9OworCisvKgorICogRmluZCBkZXZpY2VzLgorICoKKyAqIFRoZSBkZXZpY2UgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGNhbGxlci1zdXBwbGllZCBhcnJheSBvZiBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgdmFycy4KKyAqIE11bHRpcGxlIGF0dGVtcHRzIGFyZSBtYWRlIHRvIGZpbmQgZGV2aWNlcy4KKyAqIEV4ZWN1dGlvbiB0aW1lIGlzIHR5cGljYWxseSA0MDBtcyBpZiBtYXhfY291bnQgaXMgbm90IHJlYWNoZWQuCisgKgorICogU2V0IHRhcmdldF9pcCB0byB6ZXJvIHRvIGF1dG8tZGV0ZWN0IHRoZSBJUCBhZGRyZXNzLgorICogU2V0IGRldmljZV90eXBlIHRvIEhESE9NRVJVTl9ERVZJQ0VfVFlQRV9UVU5FUiB0byBkZXRlY3QgSERIb21lUnVuIHR1bmVyIGRldmljZXMuCisgKiBTZXQgZGV2aWNlX2lkIHRvIEhESE9NRVJVTl9ERVZJQ0VfSURfV0lMRENBUkQgdG8gZGV0ZWN0IGFsbCBkZXZpY2UgaWRzLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkZXZpY2VzIGZvdW5kLgorICogUmV0cnVucyAtMSBvbiBlcnJvci4KKyAqLworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9kaXNjb3Zlcl9maW5kX2RldmljZXNfY3VzdG9tKHVpbnQzMl90IHRhcmdldF9pcCwgdWludDMyX3QgZGV2aWNlX3R5cGUsIHVpbnQzMl90IGRldmljZV9pZCwgc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl9kZXZpY2VfdCByZXN1bHRfbGlzdFtdLCBpbnQgbWF4X2NvdW50KTsKKworLyoKKyAqIE9wdGlvbmFsOiBwZXJzaXN0ZW50IGRpc2NvdmVyIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgZGlzY292ZXIgcG9sbGluZyB1c2UuCisgKi8KK2V4dGVybiBMSUJUWVBFIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfdCAqaGRob21lcnVuX2Rpc2NvdmVyX2NyZWF0ZSh2b2lkKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX2Rpc2NvdmVyX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9kaXNjb3Zlcl90ICpkcyk7CitleHRlcm4gTElCVFlQRSBpbnQgaGRob21lcnVuX2Rpc2NvdmVyX2ZpbmRfZGV2aWNlcyhzdHJ1Y3QgaGRob21lcnVuX2Rpc2NvdmVyX3QgKmRzLCB1aW50MzJfdCB0YXJnZXRfaXAsIHVpbnQzMl90IGRldmljZV90eXBlLCB1aW50MzJfdCBkZXZpY2VfaWQsIHN0cnVjdCBoZGhvbWVydW5fZGlzY292ZXJfZGV2aWNlX3QgcmVzdWx0X2xpc3RbXSwgaW50IG1heF9jb3VudCk7CisKKy8qCisgKiBWZXJpZnkgdGhhdCB0aGUgZGV2aWNlIElEIGdpdmVuIGlzIHZhbGlkLgorICoKKyAqIFRoZSBkZXZpY2UgSUQgY29udGFpbnMgYSBzZWxmLWNoZWNrIHNlcXVlbmNlIHRoYXQgZGV0ZWN0cyBjb21tb24gdXNlciBpbnB1dCBlcnJvcnMgaW5jbHVkaW5nCisgKiBzaW5nbGUtZGlnaXQgZXJyb3JzIGFuZCB0d28gZGlnaXQgdHJhbnNwb3NpdGlvbiBlcnJvcnMuCisgKgorICogUmV0dXJucyBUUlVFIGlmIHZhbGlkLgorICogUmV0dXJucyBGQUxTRSBpZiBub3QgdmFsaWQuCisgKi8KK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fZGlzY292ZXJfdmFsaWRhdGVfZGV2aWNlX2lkKHVpbnQzMl90IGRldmljZV9pZCk7CisKKy8qCisgKiBEZXRlY3QgaWYgYW4gSVAgYWRkcmVzcyBpcyBtdWx0aWNhc3QuCisgKgorICogUmV0dXJucyBUUlVFIGlmIG11bHRpY2FzdC4KKyAqIFJldHVybnMgRkFMU0UgaWYgemVybywgdW5pY2FzdCwgZXhwZXJtZW50YWwsIG9yIGJyb2FkY2FzdC4KKyAqLworZXh0ZXJuIExJQlRZUEUgYm9vbF90IGhkaG9tZXJ1bl9kaXNjb3Zlcl9pc19pcF9tdWx0aWNhc3QodWludDMyX3QgaXBfYWRkcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX29zLmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTUwNmUwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fb3MuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogaGRob21lcnVuX29zLmgKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDA4IFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKyNkZWZpbmUgX19XSU5ET1dTX18KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dJTkRPV1NfXykKKyNpbmNsdWRlICJoZGhvbWVydW5fb3Nfd2luZG93cy5oIgorI2Vsc2UKKyNpbmNsdWRlICJoZGhvbWVydW5fb3NfcG9zaXguaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVFJVRSkKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZBTFNFKQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fb3NfcG9zaXguYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fb3NfcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNWVlY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc19wb3NpeC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogaGRob21lcnVuX29zX3Bvc2l4LmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImhkaG9tZXJ1bl9vcy5oIgorCit1aW50MzJfdCByYW5kb21fZ2V0MzIodm9pZCkKK3sKKwlGSUxFICpmcCA9IGZvcGVuKCIvZGV2L3VyYW5kb20iLCAicmIiKTsKKwlpZiAoIWZwKSB7CisJCXJldHVybiAodWludDMyX3QpcmFuZCgpOworCX0KKworCXVpbnQzMl90IFJlc3VsdDsKKwlpZiAoZnJlYWQoJlJlc3VsdCwgNCwgMSwgZnApICE9IDEpIHsKKwkJUmVzdWx0ID0gKHVpbnQzMl90KXJhbmQoKTsKKwl9CisKKwlmY2xvc2UoZnApOworCXJldHVybiBSZXN1bHQ7Cit9CisKK3VpbnQ2NF90IGdldGN1cnJlbnR0aW1lKHZvaWQpCit7CisJc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKwlzdGF0aWMgdWludDY0X3QgcmVzdWx0ID0gMDsKKwlzdGF0aWMgdWludDY0X3QgcHJldmlvdXNfdGltZSA9IDA7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmxvY2spOworCisjaWYgZGVmaW5lZChDTE9DS19NT05PVE9OSUMpCisJc3RydWN0IHRpbWVzcGVjIHRwOworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHApOworCXVpbnQ2NF90IGN1cnJlbnRfdGltZSA9ICgodWludDY0X3QpdHAudHZfc2VjICogMTAwMCkgKyAodHAudHZfbnNlYyAvIDEwMDAwMDApOworI2Vsc2UKKwlzdHJ1Y3QgdGltZXZhbCB0OworCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisJdWludDY0X3QgY3VycmVudF90aW1lID0gKCh1aW50NjRfdCl0LnR2X3NlYyAqIDEwMDApICsgKHQudHZfdXNlYyAvIDEwMDApOworI2VuZGlmCisKKwlpZiAoY3VycmVudF90aW1lID4gcHJldmlvdXNfdGltZSkgeworCQlyZXN1bHQgKz0gY3VycmVudF90aW1lIC0gcHJldmlvdXNfdGltZTsKKwl9CisKKwlwcmV2aW91c190aW1lID0gY3VycmVudF90aW1lOworCisJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgbXNsZWVwX2FwcHJveCh1aW50NjRfdCBtcykKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXlfcyA9IG1zIC8gMTAwMDsKKwlpZiAoZGVsYXlfcyA+IDApIHsKKwkJc2xlZXAoZGVsYXlfcyk7CisJCW1zIC09IGRlbGF5X3MgKiAxMDAwOworCX0KKworCXVuc2lnbmVkIGludCBkZWxheV91cyA9IG1zICogMTAwMDsKKwlpZiAoZGVsYXlfdXMgPiAwKSB7CisJCXVzbGVlcChkZWxheV91cyk7CisJfQorfQorCit2b2lkIG1zbGVlcF9taW5pbXVtKHVpbnQ2NF90IG1zKQoreworCXVpbnQ2NF90IHN0b3BfdGltZSA9IGdldGN1cnJlbnR0aW1lKCkgKyBtczsKKworCXdoaWxlICgxKSB7CisJCXVpbnQ2NF90IGN1cnJlbnRfdGltZSA9IGdldGN1cnJlbnR0aW1lKCk7CisJCWlmIChjdXJyZW50X3RpbWUgPj0gc3RvcF90aW1lKSB7CisJCQlyZXR1cm47CisJCX0KKworCQltc2xlZXBfYXBwcm94KHN0b3BfdGltZSAtIGN1cnJlbnRfdGltZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc19wb3NpeC5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc19wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NjliMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX29zX3Bvc2l4LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIGhkaG9tZXJ1bl9vc19wb3NpeC5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAxMCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKwordHlwZWRlZiBpbnQgYm9vbF90OwordHlwZWRlZiB2b2lkICgqc2lnX3QpKGludCk7CisKKyNkZWZpbmUgTElCVFlQRQorI2RlZmluZSBjb25zb2xlX3ZwcmludGYgdnByaW50ZgorI2RlZmluZSBjb25zb2xlX3ByaW50ZiBwcmludGYKKyNkZWZpbmUgVEhSRUFEX0ZVTkNfUFJFRklYIHZvaWQgKgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IHJhbmRvbV9nZXQzMih2b2lkKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQ2NF90IGdldGN1cnJlbnR0aW1lKHZvaWQpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBtc2xlZXBfYXBwcm94KHVpbnQ2NF90IG1zKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgbXNsZWVwX21pbmltdW0odWludDY0X3QgbXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc193aW5kb3dzLmMgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX29zX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Zjg0NGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc193aW5kb3dzLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBoZGhvbWVydW5fb3Nfd2luZG93cy5jCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAxMCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJoZGhvbWVydW5fb3MuaCIKKwordWludDMyX3QgcmFuZG9tX2dldDMyKHZvaWQpCit7CisJSENSWVBUUFJPViBoUHJvdjsKKwlpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhQcm92LCAwLCAwLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9WRVJJRllDT05URVhUKSkgeworCQlyZXR1cm4gKHVpbnQzMl90KXJhbmQoKTsKKwl9CisKKwl1aW50MzJfdCBSZXN1bHQ7CisJQ3J5cHRHZW5SYW5kb20oaFByb3YsIHNpemVvZihSZXN1bHQpLCAoQllURSopJlJlc3VsdCk7CisKKwlDcnlwdFJlbGVhc2VDb250ZXh0KGhQcm92LCAwKTsKKwlyZXR1cm4gUmVzdWx0OworfQorCit1aW50NjRfdCBnZXRjdXJyZW50dGltZSh2b2lkKQoreworCXN0YXRpYyBwdGhyZWFkX211dGV4X3QgbG9jayA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCXN0YXRpYyB1aW50NjRfdCByZXN1bHQgPSAwOworCXN0YXRpYyB1aW50MzJfdCBwcmV2aW91c190aW1lID0gMDsKKworCS8qIEluaXRpYWxpemF0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4gKi8KKwlpZiAobG9jayA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlwdGhyZWFkX211dGV4X2luaXQoJmxvY2ssIE5VTEwpOworCX0KKworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbG9jayk7CisKKwl1aW50MzJfdCBjdXJyZW50X3RpbWUgPSBHZXRUaWNrQ291bnQoKTsKKworCWlmIChjdXJyZW50X3RpbWUgPiBwcmV2aW91c190aW1lKSB7CisJCXJlc3VsdCArPSBjdXJyZW50X3RpbWUgLSBwcmV2aW91c190aW1lOworCX0KKworCXByZXZpb3VzX3RpbWUgPSBjdXJyZW50X3RpbWU7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBtc2xlZXBfYXBwcm94KHVpbnQ2NF90IG1zKQoreworCVNsZWVwKChEV09SRCltcyk7Cit9CisKK3ZvaWQgbXNsZWVwX21pbmltdW0odWludDY0X3QgbXMpCit7CisJdWludDY0X3Qgc3RvcF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIG1zOworCisJd2hpbGUgKDEpIHsKKwkJdWludDY0X3QgY3VycmVudF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKTsKKwkJaWYgKGN1cnJlbnRfdGltZSA+PSBzdG9wX3RpbWUpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCW1zbGVlcF9hcHByb3goc3RvcF90aW1lIC0gY3VycmVudF90aW1lKTsKKwl9Cit9CisKK2ludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QgKnRpZCwgdm9pZCAqYXR0ciwgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydCwgdm9pZCAqYXJnKQoreworCSp0aWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgc3RhcnQsIGFyZywgMCwgTlVMTCk7CisJaWYgKCEqdGlkKSB7CisJCXJldHVybiAoaW50KUdldExhc3RFcnJvcigpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGlkLCB2b2lkICoqdmFsdWVfcHRyKQoreworCXdoaWxlICgxKSB7CisJCURXT1JEIEV4aXRDb2RlID0gMDsKKwkJaWYgKCFHZXRFeGl0Q29kZVRocmVhZCh0aWQsICZFeGl0Q29kZSkpIHsKKwkJCXJldHVybiAoaW50KUdldExhc3RFcnJvcigpOworCQl9CisJCWlmIChFeGl0Q29kZSAhPSBTVElMTF9BQ1RJVkUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorCit2b2lkIHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LCB2b2lkICphdHRyKQoreworCSptdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKK30KKwordm9pZCBwdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKK3sKKwlXYWl0Rm9yU2luZ2xlT2JqZWN0KCptdXRleCwgSU5GSU5JVEUpOworfQorCit2b2lkIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCit7CisJUmVsZWFzZU11dGV4KCptdXRleCk7Cit9CisKKy8qCisgKiBUaGUgY29uc29sZSBvdXRwdXQgZm9ybWF0IHNob3VsZCBiZSBzZXQgdG8gVVRGLTgsIGhvd2V2ZXIgaW4gWFAgYW5kIFZpc3RhIHRoaXMgYnJlYWtzIGJhdGNoIGZpbGUgcHJvY2Vzc2luZy4KKyAqIEF0dGVtcHRpbmcgdG8gcmVzdG9yZSBvbiBleGl0IGZhaWxzIHRvIHJlc3RvcmUgaWYgdGhlIHByb2dyYW0gaXMgdGVybWluYXRlZCBieSB0aGUgdXNlci4KKyAqIFNvbHV0aW9uIC0gc2V0IHRoZSBvdXRwdXQgZm9ybWF0IGVhY2ggcHJpbnRmLgorICovCit2b2lkIGNvbnNvbGVfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJVUlOVCBjcCA9IEdldENvbnNvbGVPdXRwdXRDUCgpOworCVNldENvbnNvbGVPdXRwdXRDUChDUF9VVEY4KTsKKwl2cHJpbnRmKGZtdCwgYXApOworCVNldENvbnNvbGVPdXRwdXRDUChjcCk7Cit9CisKK3ZvaWQgY29uc29sZV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwljb25zb2xlX3ZwcmludGYoZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fb3Nfd2luZG93cy5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9vc193aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmY5ZTFkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fb3Nfd2luZG93cy5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogaGRob21lcnVuX29zX3dpbmRvd3MuaAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9XSU5TT0NLQVBJXworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjaW5jbHVkZSA8d3NwaWFwaS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorCisjaWYgZGVmaW5lZChETExfSU1QT1JUKQorI2RlZmluZSBMSUJUWVBFIF9fZGVjbHNwZWMoIGRsbGV4cG9ydCApCisjZWxpZiAgZGVmaW5lZChETExfRVhQT1JUKQorI2RlZmluZSBMSUJUWVBFIF9fZGVjbHNwZWMoIGRsbGltcG9ydCApCisjZWxzZQorI2RlZmluZSBMSUJUWVBFCisjZW5kaWYKKwordHlwZWRlZiBpbnQgYm9vbF90OwordHlwZWRlZiBzaWduZWQgX19pbnQ4IGludDhfdDsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgaW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgaW50MzJfdDsKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7Cit0eXBlZGVmIHZvaWQgKCpzaWdfdCkoaW50KTsKK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfbXV0ZXhfdDsKKworI2RlZmluZSB2YV9jb3B5KHgsIHkpIHggPSB5CisjZGVmaW5lIGF0b2xsIF9hdG9pNjQKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKKyNkZWZpbmUgc3RyY2FzZWNtcCBfc3RyaWNtcAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNkZWZpbmUgZnNlZWtvIF9mc2Vla2k2NAorI2RlZmluZSBmdGVsbG8gX2Z0ZWxsaTY0CisjZGVmaW5lIFRIUkVBRF9GVU5DX1BSRUZJWCBEV09SRCBXSU5BUEkKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gTElCVFlQRSB1aW50MzJfdCByYW5kb21fZ2V0MzIodm9pZCk7CitleHRlcm4gTElCVFlQRSB1aW50NjRfdCBnZXRjdXJyZW50dGltZSh2b2lkKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgbXNsZWVwX2FwcHJveCh1aW50NjRfdCBtcyk7CitleHRlcm4gTElCVFlQRSB2b2lkIG1zbGVlcF9taW5pbXVtKHVpbnQ2NF90IG1zKTsKKworZXh0ZXJuIExJQlRZUEUgaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCAqdGlkLCB2b2lkICphdHRyLCBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIHN0YXJ0LCB2b2lkICphcmcpOworZXh0ZXJuIExJQlRZUEUgaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGlkLCB2b2lkICoqdmFsdWVfcHRyKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsIHZvaWQgKmF0dHIpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBwdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCk7CitleHRlcm4gTElCVFlQRSB2b2lkIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworCisvKgorICogVGhlIGNvbnNvbGUgb3V0cHV0IGZvcm1hdCBzaG91bGQgYmUgc2V0IHRvIFVURi04LCBob3dldmVyIGluIFhQIGFuZCBWaXN0YSB0aGlzIGJyZWFrcyBiYXRjaCBmaWxlIHByb2Nlc3NpbmcuCisgKiBBdHRlbXB0aW5nIHRvIHJlc3RvcmUgb24gZXhpdCBmYWlscyB0byByZXN0b3JlIGlmIHRoZSBwcm9ncmFtIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIHVzZXIuCisgKiBTb2x1dGlvbiAtIHNldCB0aGUgb3V0cHV0IGZvcm1hdCBlYWNoIHByaW50Zi4KKyAqLworZXh0ZXJuIExJQlRZUEUgdm9pZCBjb25zb2xlX3ZwcmludGYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgY29uc29sZV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9wa3QuYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmMzNGJhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fcGt0LmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBoZGhvbWVydW5fcGt0LmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDA2IFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImhkaG9tZXJ1bi5oIgorCitzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpoZGhvbWVydW5fcGt0X2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCA9IChzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaGRob21lcnVuX3BrdF90KSk7CisJaWYgKCFwa3QpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaGRob21lcnVuX3BrdF9yZXNldChwa3QpOworCisJcmV0dXJuIHBrdDsKK30KKwordm9pZCBoZGhvbWVydW5fcGt0X2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0KQoreworCWZyZWUocGt0KTsKK30KKwordm9pZCBoZGhvbWVydW5fcGt0X3Jlc2V0KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCkKK3sKKwlwa3QtPmxpbWl0ID0gcGt0LT5idWZmZXIgKyBzaXplb2YocGt0LT5idWZmZXIpIC0gNDsKKwlwa3QtPnN0YXJ0ID0gcGt0LT5idWZmZXIgKyAxMDI0OworCXBrdC0+ZW5kID0gcGt0LT5zdGFydDsKKwlwa3QtPnBvcyA9IHBrdC0+c3RhcnQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBoZGhvbWVydW5fcGt0X2NhbGNfY3JjKHVpbnQ4X3QgKnN0YXJ0LCB1aW50OF90ICplbmQpCit7CisJdWludDhfdCAqcG9zID0gc3RhcnQ7CisJdWludDMyX3QgY3JjID0gMHhGRkZGRkZGRjsKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCXVpbnQ4X3QgeCA9ICh1aW50OF90KShjcmMpIF4gKnBvcysrOworCQljcmMgPj49IDg7CisJCWlmICh4ICYgMHgwMSkgY3JjIF49IDB4NzcwNzMwOTY7CisJCWlmICh4ICYgMHgwMikgY3JjIF49IDB4RUUwRTYxMkM7CisJCWlmICh4ICYgMHgwNCkgY3JjIF49IDB4MDc2REM0MTk7CisJCWlmICh4ICYgMHgwOCkgY3JjIF49IDB4MEVEQjg4MzI7CisJCWlmICh4ICYgMHgxMCkgY3JjIF49IDB4MURCNzEwNjQ7CisJCWlmICh4ICYgMHgyMCkgY3JjIF49IDB4M0I2RTIwQzg7CisJCWlmICh4ICYgMHg0MCkgY3JjIF49IDB4NzZEQzQxOTA7CisJCWlmICh4ICYgMHg4MCkgY3JjIF49IDB4RURCODgzMjA7CisJfQorCXJldHVybiBjcmMgXiAweEZGRkZGRkZGOworfQorCit1aW50OF90IGhkaG9tZXJ1bl9wa3RfcmVhZF91OChzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QpCit7CisJdWludDhfdCB2ID0gKnBrdC0+cG9zKys7CisJcmV0dXJuIHY7Cit9CisKK3VpbnQxNl90IGhkaG9tZXJ1bl9wa3RfcmVhZF91MTYoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0KQoreworCXVpbnQxNl90IHY7CisJdiA9ICAodWludDE2X3QpKnBrdC0+cG9zKysgPDwgODsKKwl2IHw9ICh1aW50MTZfdCkqcGt0LT5wb3MrKyA8PCAwOworCXJldHVybiB2OworfQorCit1aW50MzJfdCBoZGhvbWVydW5fcGt0X3JlYWRfdTMyKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCkKK3sKKwl1aW50MzJfdCB2OworCXYgPSAgKHVpbnQzMl90KSpwa3QtPnBvcysrIDw8IDI0OworCXYgfD0gKHVpbnQzMl90KSpwa3QtPnBvcysrIDw8IDE2OworCXYgfD0gKHVpbnQzMl90KSpwa3QtPnBvcysrIDw8IDg7CisJdiB8PSAodWludDMyX3QpKnBrdC0+cG9zKysgPDwgMDsKKwlyZXR1cm4gdjsKK30KKworc2l6ZV90IGhkaG9tZXJ1bl9wa3RfcmVhZF92YXJfbGVuZ3RoKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCkKK3sKKwlzaXplX3QgbGVuZ3RoOworCQorCWlmIChwa3QtPnBvcyArIDEgPiBwa3QtPmVuZCkgeworCQlyZXR1cm4gKHNpemVfdCktMTsKKwl9CisKKwlsZW5ndGggPSAoc2l6ZV90KSpwa3QtPnBvcysrOworCWlmIChsZW5ndGggJiAweDAwODApIHsKKwkJaWYgKHBrdC0+cG9zICsgMSA+IHBrdC0+ZW5kKSB7CisJCQlyZXR1cm4gKHNpemVfdCktMTsKKwkJfQorCisJCWxlbmd0aCAmPSAweDAwN0Y7CisJCWxlbmd0aCB8PSAoc2l6ZV90KSpwa3QtPnBvcysrIDw8IDc7CisJfQorCQorCXJldHVybiBsZW5ndGg7IAorfQorCit1aW50OF90ICpoZGhvbWVydW5fcGt0X3JlYWRfdGx2KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDhfdCAqcHRhZywgc2l6ZV90ICpwbGVuZ3RoKQoreworCWlmIChwa3QtPnBvcyArIDIgPiBwa3QtPmVuZCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJKnB0YWcgPSBoZGhvbWVydW5fcGt0X3JlYWRfdTgocGt0KTsKKwkqcGxlbmd0aCA9IGhkaG9tZXJ1bl9wa3RfcmVhZF92YXJfbGVuZ3RoKHBrdCk7CisKKwlpZiAocGt0LT5wb3MgKyAqcGxlbmd0aCA+IHBrdC0+ZW5kKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlyZXR1cm4gcGt0LT5wb3MgKyAqcGxlbmd0aDsKK30KKwordm9pZCBoZGhvbWVydW5fcGt0X3dyaXRlX3U4KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDhfdCB2KQoreworCSpwa3QtPnBvcysrID0gdjsKKworCWlmIChwa3QtPnBvcyA+IHBrdC0+ZW5kKSB7CisJCXBrdC0+ZW5kID0gcGt0LT5wb3M7CisJfQorfQorCit2b2lkIGhkaG9tZXJ1bl9wa3Rfd3JpdGVfdTE2KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDE2X3QgdikKK3sKKwkqcGt0LT5wb3MrKyA9ICh1aW50OF90KSh2ID4+IDgpOworCSpwa3QtPnBvcysrID0gKHVpbnQ4X3QpKHYgPj4gMCk7CisKKwlpZiAocGt0LT5wb3MgPiBwa3QtPmVuZCkgeworCQlwa3QtPmVuZCA9IHBrdC0+cG9zOworCX0KK30KKwordm9pZCBoZGhvbWVydW5fcGt0X3dyaXRlX3UzMihzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QsIHVpbnQzMl90IHYpCit7CisJKnBrdC0+cG9zKysgPSAodWludDhfdCkodiA+PiAyNCk7CisJKnBrdC0+cG9zKysgPSAodWludDhfdCkodiA+PiAxNik7CisJKnBrdC0+cG9zKysgPSAodWludDhfdCkodiA+PiA4KTsKKwkqcGt0LT5wb3MrKyA9ICh1aW50OF90KSh2ID4+IDApOworCisJaWYgKHBrdC0+cG9zID4gcGt0LT5lbmQpIHsKKwkJcGt0LT5lbmQgPSBwa3QtPnBvczsKKwl9Cit9CisKK3ZvaWQgaGRob21lcnVuX3BrdF93cml0ZV92YXJfbGVuZ3RoKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgc2l6ZV90IHYpCit7CisJaWYgKHYgPD0gMTI3KSB7CisJCSpwa3QtPnBvcysrID0gKHVpbnQ4X3QpdjsKKwl9IGVsc2UgeworCQkqcGt0LT5wb3MrKyA9ICh1aW50OF90KSh2IHwgMHg4MCk7CisJCSpwa3QtPnBvcysrID0gKHVpbnQ4X3QpKHYgPj4gNyk7CisJfQorCisJaWYgKHBrdC0+cG9zID4gcGt0LT5lbmQpIHsKKwkJcGt0LT5lbmQgPSBwa3QtPnBvczsKKwl9Cit9CisKK3ZvaWQgaGRob21lcnVuX3BrdF93cml0ZV9tZW0oc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW5ndGgpCit7CisJbWVtY3B5KHBrdC0+cG9zLCBtZW0sIGxlbmd0aCk7CisJcGt0LT5wb3MgKz0gbGVuZ3RoOworCisJaWYgKHBrdC0+cG9zID4gcGt0LT5lbmQpIHsKKwkJcGt0LT5lbmQgPSBwa3QtPnBvczsKKwl9Cit9CisKK2ludCBoZGhvbWVydW5fcGt0X29wZW5fZnJhbWUoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCB1aW50MTZfdCAqcHR5cGUpCit7CisJcGt0LT5wb3MgPSBwa3QtPnN0YXJ0OworCisJaWYgKHBrdC0+cG9zICsgNCA+IHBrdC0+ZW5kKSB7CisJCXJldHVybiAwOworCX0KKworCSpwdHlwZSA9IGhkaG9tZXJ1bl9wa3RfcmVhZF91MTYocGt0KTsKKwlzaXplX3QgbGVuZ3RoID0gaGRob21lcnVuX3BrdF9yZWFkX3UxNihwa3QpOworCXBrdC0+cG9zICs9IGxlbmd0aDsKKworCWlmIChwa3QtPnBvcyArIDQgPiBwa3QtPmVuZCkgeworCQlwa3QtPnBvcyA9IHBrdC0+c3RhcnQ7CisJCXJldHVybiAwOworCX0KKworCXVpbnQzMl90IGNhbGNfY3JjID0gaGRob21lcnVuX3BrdF9jYWxjX2NyYyhwa3QtPnN0YXJ0LCBwa3QtPnBvcyk7CisKKwl1aW50MzJfdCBwYWNrZXRfY3JjOworCXBhY2tldF9jcmMgPSAgKHVpbnQzMl90KSpwa3QtPnBvcysrIDw8IDA7CisJcGFja2V0X2NyYyB8PSAodWludDMyX3QpKnBrdC0+cG9zKysgPDwgODsKKwlwYWNrZXRfY3JjIHw9ICh1aW50MzJfdCkqcGt0LT5wb3MrKyA8PCAxNjsKKwlwYWNrZXRfY3JjIHw9ICh1aW50MzJfdCkqcGt0LT5wb3MrKyA8PCAyNDsKKwlpZiAoY2FsY19jcmMgIT0gcGFja2V0X2NyYykgeworCQlyZXR1cm4gLTE7CisJfQorCisJcGt0LT5zdGFydCArPSA0OworCXBrdC0+ZW5kID0gcGt0LT5zdGFydCArIGxlbmd0aDsKKwlwa3QtPnBvcyA9IHBrdC0+c3RhcnQ7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgaGRob21lcnVuX3BrdF9zZWFsX2ZyYW1lKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDE2X3QgZnJhbWVfdHlwZSkKK3sKKwlzaXplX3QgbGVuZ3RoID0gcGt0LT5lbmQgLSBwa3QtPnN0YXJ0OworCisJcGt0LT5zdGFydCAtPSA0OworCXBrdC0+cG9zID0gcGt0LT5zdGFydDsKKwloZGhvbWVydW5fcGt0X3dyaXRlX3UxNihwa3QsIGZyYW1lX3R5cGUpOworCWhkaG9tZXJ1bl9wa3Rfd3JpdGVfdTE2KHBrdCwgKHVpbnQxNl90KWxlbmd0aCk7CisKKwl1aW50MzJfdCBjcmMgPSBoZGhvbWVydW5fcGt0X2NhbGNfY3JjKHBrdC0+c3RhcnQsIHBrdC0+ZW5kKTsKKwkqcGt0LT5lbmQrKyA9ICh1aW50OF90KShjcmMgPj4gMCk7CisJKnBrdC0+ZW5kKysgPSAodWludDhfdCkoY3JjID4+IDgpOworCSpwa3QtPmVuZCsrID0gKHVpbnQ4X3QpKGNyYyA+PiAxNik7CisJKnBrdC0+ZW5kKysgPSAodWludDhfdCkoY3JjID4+IDI0KTsKKworCXBrdC0+cG9zID0gcGt0LT5zdGFydDsKK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fcGt0LmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX3BrdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhYzE0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX3BrdC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogaGRob21lcnVuX3BrdC5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDUtMjAwNiBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGUgZGlzY292ZXIgcHJvdG9jb2wgKFVEUCBwb3J0IDY1MDAxKSBhbmQgY29udHJvbCBwcm90b2NvbCAoVENQIHBvcnQgNjUwMDEpCisgKiBib3RoIHVzZSB0aGUgc2FtZSBwYWNrZXQgYmFzZWQgZm9ybWF0OgorICoJdWludDE2X3QJUGFja2V0IHR5cGUKKyAqCXVpbnQxNl90CVBheWxvYWQgbGVuZ3RoIChieXRlcykKKyAqCXVpbnQ4X3RbXQlQYXlsb2FkIGRhdGEgKDAtbiBieXRlcykuCisgKgl1aW50MzJfdAlDUkMgKEV0aGVybmV0IHN0eWxlIDMyLWJpdCBDUkMpCisgKgorICogQWxsIHZhcmlhYmxlcyBhcmUgYmlnLWVuZGlhbiBleGNlcHQgZm9yIHRoZSBjcmMgd2hpY2ggaXMgbGl0dGxlLWVuZGlhbi4KKyAqCisgKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBwYWNrZXQgdHlwZSBhcmUgbGlzdGVkIGJlbG93IGFzIGRlZmluZXMgcHJlZml4ZWQKKyAqIHdpdGggIkhESE9NRVJVTl9UWVBFXyIKKyAqCisgKiBEaXNjb3Zlcnk6CisgKgorICogVGhlIHBheWxvYWQgZm9yIGEgZGlzY292ZXJ5IHJlcXVlc3Qgb3IgcmVwbHkgaXMgYSBzaW1wbGUgc2VxdWVuY2Ugb2YKKyAqIHRhZy1sZW5ndGgtdmFsdWUgZGF0YToKKyAqCXVpbnQ4X3QJCVRhZworICoJdmFybGVuCQlMZW5ndGgKKyAqCXVpbnQ4X3RbXQlWYWx1ZSAoMC1uIGJ5dGVzKQorICoKKyAqIFRoZSBsZW5ndGggZmllbGQgY2FuIGJlIG9uZSBvciB0d28gYnl0ZXMgbG9uZy4KKyAqIEZvciBhIGxlbmd0aCA8PSAxMjcgYnl0ZXMgdGhlIGxlbmd0aCBpcyBleHByZXNzZWQgYXMgYSBzaW5nbGUgYnl0ZS4gVGhlCisgKiBtb3N0LXNpZ25pZmljYW50LWJpdCBpcyBjbGVhciBpbmRpY2F0aW5nIGEgc2luZ2xlLWJ5dGUgbGVuZ3RoLgorICogRm9yIGEgbGVuZ3RoID49IDEyOCBieXRlcyB0aGUgbGVuZ3RoIGlzIGV4cHJlc3NlZCBhcyBhIHNlcXVlbmNlIG9mIHR3byBieXRlcyBhcyBmb2xsb3dzOgorICogVGhlIGZpcnN0IGJ5dGUgaXMgY29udGFpbnMgdGhlIGxlYXN0LXNpZ25pZmljYW50IDctYml0cyBvZiB0aGUgbGVuZ3RoLiBUaGUKKyAqIG1vc3Qtc2lnbmlmaWNhbnQgYml0IGlzIHRoZW4gc2V0IChhZGQgMHg4MCkgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBhIHR3byBieXRlIGxlbmd0aC4KKyAqIFRoZSBzZWNvbmQgYnl0ZSBjb250YWlucyB0aGUgbGVuZ3RoIHNoaWZ0ZWQgZG93biA3IGJpdHMuCisgKgorICogQSBkaXNjb3ZlcnkgcmVxdWVzdCBwYWNrZXQgaGFzIGEgcGFja2V0IHR5cGUgb2YgSERIT01FUlVOX1RZUEVfRElTQ09WRVJfUkVRIGFuZCBzaG91bGQKKyAqIGNvbnRhaW4gdHdvIHRhZ3M6IEhESE9NRVJVTl9UQUdfREVWSUNFX1RZUEUgYW5kIEhESE9NRVJVTl9UQUdfREVWSUNFX0lELgorICogVGhlIEhESE9NRVJVTl9UQUdfREVWSUNFX1RZUEUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBIREhPTUVSVU5fREVWSUNFX1RZUEVfVFVORVIuCisgKiBUaGUgSERIT01FUlVOX1RBR19ERVZJQ0VfSUQgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBIREhPTUVSVU5fREVWSUNFX0lEX1dJTERDQVJEIHRvIG1hdGNoCisgKiBhbGwgZGV2aWNlcywgb3IgdG8gdGhlIDMyLWJpdCBkZXZpY2UgaWQgbnVtYmVyIHRvIG1hdGNoIGEgc2luZ2xlIGRldmljZS4KKyAqCisgKiBUaGUgZGlzY292ZXJ5IHJlc3BvbnNlIHBhY2tldCBoYXMgYSBwYWNrZXQgdHlwZSBvZiBIREhPTUVSVU5fVFlQRV9ESVNDT1ZFUl9SUFkgYW5kIGhhcyB0aGUKKyAqIHNhbWUgZm9ybWF0IGFzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBwYWNrZXQgd2l0aCB0aGUgdHdvIHRhZ3M6IEhESE9NRVJVTl9UQUdfREVWSUNFX1RZUEUgYW5kCisgKiBIREhPTUVSVU5fVEFHX0RFVklDRV9JRC4gSW4gdGhlIGZ1dHVyZSBhZGRpdGlvbmFsIHRhZ3MgbWF5IGFsc28gYmUgcmV0dXJuZWQgLSB1bmtub3duIHRhZ3MKKyAqIHNob3VsZCBiZSBza2lwcGVkIGFuZCBub3QgdHJlYXRlZCBhcyBhbiBlcnJvci4KKyAqCisgKiBDb250cm9sIGdldC9zZXQ6CisgKgorICogVGhlIHBheWxvYWQgZm9yIGEgY29udHJvbCBnZXQvc2V0IHJlcXVlc3QgaXMgYSBzaW1wbGUgc2VxdWVuY2Ugb2YgdGFnLWxlbmd0aC12YWx1ZSBkYXRhCisgKiBmb2xsb3dpbmcgdGhlIHNhbWUgZm9ybWF0IGFzIGZvciBkaXNjb3ZlciBwYWNrZXRzLgorICoKKyAqIEEgZ2V0IHJlcXVlc3QgcGFja2V0IGhhcyBhIHBhY2tldCB0eXBlIG9mIEhESE9NRVJVTl9UWVBFX0dFVFNFVF9SRVEgYW5kIHNob3VsZCBjb250YWluCisgKiB0aGUgdGFnOiBIREhPTUVSVU5fVEFHX0dFVFNFVF9OQU1FLiBUaGUgSERIT01FUlVOX1RBR19HRVRTRVRfTkFNRSB2YWx1ZSBzaG91bGQgYmUgYSBzZXF1ZW5jZQorICogb2YgYnl0ZXMgZm9ybWluZyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgTlVMTC4gVGhlIFRMViBsZW5ndGggbXVzdCBpbmNsdWRlCisgKiB0aGUgTlVMTCBjaGFyYWN0ZXIgc28gdGhlIGxlbmd0aCBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHN0cmxlbihzdHIpICsgMS4KKyAqCisgKiBBIHNldCByZXF1ZXN0IHBhY2tldCBoYXMgYSBwYWNrZXQgdHlwZSBvZiBIREhPTUVSVU5fVFlQRV9HRVRTRVRfUkVRIChzYW1lIGFzIGEgZ2V0IHJlcXVlc3QpCisgKiBhbmQgc2hvdWxkIGNvbnRhaW4gdHdvIHRhZ3M6IEhESE9NRVJVTl9UQUdfR0VUU0VUX05BTUUgYW5kIEhESE9NRVJVTl9UQUdfR0VUU0VUX1ZBTFVFLgorICogVGhlIEhESE9NRVJVTl9UQUdfR0VUU0VUX05BTUUgdmFsdWUgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgZm9ybWluZyBhIG51bGwtdGVybWluYXRlZAorICogc3RyaW5nLCBpbmNsdWRpbmcgdGhlIE5VTEwuCisgKiBUaGUgSERIT01FUlVOX1RBR19HRVRTRVRfVkFMVUUgdmFsdWUgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGJ5dGVzIGZvcm1pbmcgYSBudWxsLXRlcm1pbmF0ZWQKKyAqIHN0cmluZywgaW5jbHVkaW5nIHRoZSBOVUxMLgorICoKKyAqIFRoZSBnZXQgYW5kIHNldCByZXBseSBwYWNrZXRzIGhhdmUgdGhlIHBhY2tldCB0eXBlIEhESE9NRVJVTl9UWVBFX0dFVFNFVF9SUFkgYW5kIGhhdmUgdGhlIHNhbWUKKyAqIGZvcm1hdCBhcyB0aGUgc2V0IHJlcXVlc3QgcGFja2V0IHdpdGggdGhlIHR3byB0YWdzOiBIREhPTUVSVU5fVEFHX0dFVFNFVF9OQU1FIGFuZAorICogSERIT01FUlVOX1RBR19HRVRTRVRfVkFMVUUuIEEgc2V0IHJlcXVlc3QgaXMgYWxzbyBpbXBsaWNpdCBnZXQgcmVxdWVzdCBzbyB0aGUgdXBkYXRlZCB2YWx1ZSBpcworICogcmV0dXJuZWQuCisgKgorICogSWYgdGhlIGRldmljZSBlbmNvdW50ZXJzIGFuIGVycm9yIGhhbmRsaW5nIHRoZSBnZXQgb3Igc2V0IHJlcXVlc3QgdGhlbiB0aGUgZ2V0L3NldCByZXBseSBwYWNrZXQKKyAqIHdpbGwgY29udGFpbiB0aGUgdGFnIEhESE9NRVJVTl9UQUdfRVJST1JfTUVTU0FHRS4gVGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUgaXMgYSBzZXF1ZW5jZSBvZgorICogYnl0ZXMgZm9ybWluZyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgTlVMTC4KKyAqCisgKiBJbiB0aGUgZnV0dXJlIGFkZGl0aW9uYWwgdGFncyBtYXkgYWxzbyBiZSByZXR1cm5lZCAtIHVua25vd24gdGFncyBzaG91bGQgYmUgc2tpcHBlZCBhbmQgbm90CisgKiB0cmVhdGVkIGFzIGFuIGVycm9yLgorICoKKyAqIFNlY3VyaXR5IG5vdGU6IFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IHJlbHkgb24gdGhlIE5VTEwgY2hhcmFjdGVyIGJlaW5nIHByZXNlbnQuIFRoZQorICogYXBwbGljYXRpb24gc2hvdWxkIHdyaXRlIGEgTlVMTCBjaGFyYWN0ZXIgYmFzZWQgb24gdGhlIFRMViBsZW5ndGggdG8gcHJvdGVjdCB0aGUgYXBwbGljYXRpb24KKyAqIGZyb20gYSBwb3RlbnRpYWwgYXR0YWNrLgorICoKKyAqIEZpcm13YXJlIFVwZ3JhZGU6CisgKgorICogQSBmaXJtd2FyZSB1cGdyYWRlIHBhY2tldCBoYXMgYSBwYWNrZXQgdHlwZSBvZiBIREhPTUVSVU5fVFlQRV9VUEdSQURFX1JFUSBhbmQgaGFzIGEgZml4ZWQgZm9ybWF0OgorICoJdWludDMyX3QJUG9zaXRpb24gaW4gYnl0ZXMgZnJvbSBzdGFydCBvZiBmaWxlLgorICoJdWludDhfdFsyNTZdCUZpcm13YXJlIGRhdGEgKDI1NiBieXRlcykKKyAqCisgKiBUaGUgZGF0YSBtdXN0IGJlIHVwbG9hZGVkIGluIDI1NiBieXRlIGNodW5rcyBhbmQgbXVzdCBiZSB1cGxvYWRlZCBpbiBvcmRlci4KKyAqIFRoZSBwb3NpdGlvbiBudW1iZXIgaXMgaW4gYnl0ZXMgc28gd2lsbCBpbmNyZW1lbnQgYnkgMjU2IGVhY2ggdGltZS4KKyAqCisgKiBXaGVuIGFsbCBkYXRhIGlzIHVwbG9hZGVkIGl0IHNob3VsZCBiZSBzaWduYWxlZCBjb21wbGV0ZSBieSBzZW5kaW5nIGFub3RoZXIgcGFja2V0IG9mIHR5cGUKKyAqIEhESE9NRVJVTl9UWVBFX1VQR1JBREVfUkVRIHdpdGggcGF5bG9hZCBvZiBhIHNpbmdsZSB1aW50MzJfdCB3aXRoIHRoZSB2YWx1ZSAweEZGRkZGRkZGLgorICovCisKKyNkZWZpbmUgSERIT01FUlVOX0RJU0NPVkVSX1VEUF9QT1JUIDY1MDAxCisjZGVmaW5lIEhESE9NRVJVTl9DT05UUk9MX1RDUF9QT1JUIDY1MDAxCisKKyNkZWZpbmUgSERIT01FUlVOX01BWF9QQUNLRVRfU0laRSAxNDYwCisjZGVmaW5lIEhESE9NRVJVTl9NQVhfUEFZTE9BRF9TSVpFIDE0NTIKKworI2RlZmluZSBIREhPTUVSVU5fVFlQRV9ESVNDT1ZFUl9SRVEgMHgwMDAyCisjZGVmaW5lIEhESE9NRVJVTl9UWVBFX0RJU0NPVkVSX1JQWSAweDAwMDMKKyNkZWZpbmUgSERIT01FUlVOX1RZUEVfR0VUU0VUX1JFUSAweDAwMDQKKyNkZWZpbmUgSERIT01FUlVOX1RZUEVfR0VUU0VUX1JQWSAweDAwMDUKKyNkZWZpbmUgSERIT01FUlVOX1RZUEVfVVBHUkFERV9SRVEgMHgwMDA2CisjZGVmaW5lIEhESE9NRVJVTl9UWVBFX1VQR1JBREVfUlBZIDB4MDAwNworCisjZGVmaW5lIEhESE9NRVJVTl9UQUdfREVWSUNFX1RZUEUgMHgwMQorI2RlZmluZSBIREhPTUVSVU5fVEFHX0RFVklDRV9JRCAweDAyCisjZGVmaW5lIEhESE9NRVJVTl9UQUdfR0VUU0VUX05BTUUgMHgwMworI2RlZmluZSBIREhPTUVSVU5fVEFHX0dFVFNFVF9WQUxVRSAweDA0CisjZGVmaW5lIEhESE9NRVJVTl9UQUdfR0VUU0VUX0xPQ0tLRVkgMHgxNQorI2RlZmluZSBIREhPTUVSVU5fVEFHX0VSUk9SX01FU1NBR0UgMHgwNQorI2RlZmluZSBIREhPTUVSVU5fVEFHX1RVTkVSX0NPVU5UIDB4MTAKKworI2RlZmluZSBIREhPTUVSVU5fREVWSUNFX1RZUEVfV0lMRENBUkQgMHhGRkZGRkZGRgorI2RlZmluZSBIREhPTUVSVU5fREVWSUNFX1RZUEVfVFVORVIgMHgwMDAwMDAwMQorI2RlZmluZSBIREhPTUVSVU5fREVWSUNFX0lEX1dJTERDQVJEIDB4RkZGRkZGRkYKKworI2RlZmluZSBIREhPTUVSVU5fTUlOX1BFRUtfTEVOR1RIIDQKKworc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCB7CisJdWludDhfdCAqcG9zOworCXVpbnQ4X3QgKnN0YXJ0OworCXVpbnQ4X3QgKmVuZDsKKwl1aW50OF90ICpsaW1pdDsKKwl1aW50OF90IGJ1ZmZlclszMDc0XTsKK307CisKK2V4dGVybiBMSUJUWVBFIHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKmhkaG9tZXJ1bl9wa3RfY3JlYXRlKHZvaWQpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fcGt0X2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0KTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3BrdF9yZXNldChzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QpOworCitleHRlcm4gTElCVFlQRSB1aW50OF90IGhkaG9tZXJ1bl9wa3RfcmVhZF91OChzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QpOworZXh0ZXJuIExJQlRZUEUgdWludDE2X3QgaGRob21lcnVuX3BrdF9yZWFkX3UxNihzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QpOworZXh0ZXJuIExJQlRZUEUgdWludDMyX3QgaGRob21lcnVuX3BrdF9yZWFkX3UzMihzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QpOworZXh0ZXJuIExJQlRZUEUgc2l6ZV90IGhkaG9tZXJ1bl9wa3RfcmVhZF92YXJfbGVuZ3RoKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCk7CitleHRlcm4gTElCVFlQRSB1aW50OF90ICpoZGhvbWVydW5fcGt0X3JlYWRfdGx2KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDhfdCAqcHRhZywgc2l6ZV90ICpwbGVuZ3RoKTsKKworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fcGt0X3dyaXRlX3U4KHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgdWludDhfdCB2KTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3BrdF93cml0ZV91MTYoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCB1aW50MTZfdCB2KTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3BrdF93cml0ZV91MzIoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCB1aW50MzJfdCB2KTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3BrdF93cml0ZV92YXJfbGVuZ3RoKHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCwgc2l6ZV90IHYpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fcGt0X3dyaXRlX21lbShzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QsIGNvbnN0IHZvaWQgKm1lbSwgc2l6ZV90IGxlbmd0aCk7CisKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fcGt0X29wZW5fZnJhbWUoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCB1aW50MTZfdCAqcHR5cGUpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fcGt0X3NlYWxfZnJhbWUoc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCAqcGt0LCB1aW50MTZfdCBmcmFtZV90eXBlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fc29jay5oIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9zb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjllMTkxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fc29jay5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBoZGhvbWVydW5fc29jay5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTAgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaGRob21lcnVuX2xvY2FsX2lwX2luZm9fdCB7CisJdWludDMyX3QgaXBfYWRkcjsKKwl1aW50MzJfdCBzdWJuZXRfbWFzazsKK307CisKK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fbG9jYWxfaXBfaW5mbyhzdHJ1Y3QgaGRob21lcnVuX2xvY2FsX2lwX2luZm9fdCBpcF9pbmZvX2xpc3RbXSwgaW50IG1heF9jb3VudCk7CisKKyNkZWZpbmUgSERIT01FUlVOX1NPQ0tfSU5WQUxJRCAtMQorCit0eXBlZGVmIGludCBoZGhvbWVydW5fc29ja190OworCitleHRlcm4gTElCVFlQRSBoZGhvbWVydW5fc29ja190IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV91ZHAodm9pZCk7CitleHRlcm4gTElCVFlQRSBoZGhvbWVydW5fc29ja190IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV90Y3Aodm9pZCk7CitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3koaGRob21lcnVuX3NvY2tfdCBzb2NrKTsKKworZXh0ZXJuIExJQlRZUEUgaW50IGhkaG9tZXJ1bl9zb2NrX2dldGxhc3RlcnJvcih2b2lkKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9zb2NrX2dldHNvY2tuYW1lX2FkZHIoaGRob21lcnVuX3NvY2tfdCBzb2NrKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQxNl90IGhkaG9tZXJ1bl9zb2NrX2dldHNvY2tuYW1lX3BvcnQoaGRob21lcnVuX3NvY2tfdCBzb2NrKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9zb2NrX2dldHBlZXJuYW1lX2FkZHIoaGRob21lcnVuX3NvY2tfdCBzb2NrKTsKK2V4dGVybiBMSUJUWVBFIHVpbnQzMl90IGhkaG9tZXJ1bl9zb2NrX2dldGFkZHJpbmZvX2FkZHIoaGRob21lcnVuX3NvY2tfdCBzb2NrLCBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIExJQlRZUEUgYm9vbF90IGhkaG9tZXJ1bl9zb2NrX2pvaW5fbXVsdGljYXN0X2dyb3VwKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbXVsdGljYXN0X2lwLCB1aW50MzJfdCBsb2NhbF9pcCk7CitleHRlcm4gTElCVFlQRSBib29sX3QgaGRob21lcnVuX3NvY2tfbGVhdmVfbXVsdGljYXN0X2dyb3VwKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbXVsdGljYXN0X2lwLCB1aW50MzJfdCBsb2NhbF9pcCk7CisKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fc29ja19iaW5kKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbG9jYWxfYWRkciwgdWludDE2X3QgbG9jYWxfcG9ydCwgYm9vbF90IGFsbG93X3JldXNlKTsKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fc29ja19jb25uZWN0KGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgcmVtb3RlX2FkZHIsIHVpbnQxNl90IHJlbW90ZV9wb3J0LCB1aW50NjRfdCB0aW1lb3V0KTsKKworZXh0ZXJuIExJQlRZUEUgYm9vbF90IGhkaG9tZXJ1bl9zb2NrX3NlbmQoaGRob21lcnVuX3NvY2tfdCBzb2NrLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoLCB1aW50NjRfdCB0aW1lb3V0KTsKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fc29ja19zZW5kdG8oaGRob21lcnVuX3NvY2tfdCBzb2NrLCB1aW50MzJfdCByZW1vdGVfYWRkciwgdWludDE2X3QgcmVtb3RlX3BvcnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgsIHVpbnQ2NF90IHRpbWVvdXQpOworCitleHRlcm4gTElCVFlQRSBib29sX3QgaGRob21lcnVuX3NvY2tfcmVjdihoZGhvbWVydW5fc29ja190IHNvY2ssIHZvaWQgKmRhdGEsIHNpemVfdCAqbGVuZ3RoLCB1aW50NjRfdCB0aW1lb3V0KTsKK2V4dGVybiBMSUJUWVBFIGJvb2xfdCBoZGhvbWVydW5fc29ja19yZWN2ZnJvbShoZGhvbWVydW5fc29ja190IHNvY2ssIHVpbnQzMl90ICpyZW1vdGVfYWRkciwgdWludDE2X3QgKnJlbW90ZV9wb3J0LCB2b2lkICpkYXRhLCBzaXplX3QgKmxlbmd0aCwgdWludDY0X3QgdGltZW91dCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX3NvY2tfcG9zaXguYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fc29ja19wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyZGNjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJoZGhvbWVydW4vaGRob21lcnVuX3NvY2tfcG9zaXguYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIGhkaG9tZXJ1bl9zb2NrX3Bvc2l4LmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBTaWxpY29uZHVzdCBVU0EgSW5jLiA8d3d3LnNpbGljb25kdXN0LmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnkuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiAKKyAqIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHlvdSBtYXkgbGluaywgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgYW4gYXBwbGljYXRpb24gd2l0aCBhCisgKiBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYW4KKyAqIGV4ZWN1dGFibGUgZmlsZSBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhhdCBleGVjdXRhYmxlIGZpbGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsCisgKiB3aXRob3V0IGFueSBvZiB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGNsYXVzZSA0IG9mCisgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICogCisgKiBCeSAiYSBwdWJsaWNseSBkaXN0cmlidXRlZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Iiwgd2UgbWVhbgorICogZWl0aGVyIHRoZSB1bm1vZGlmaWVkIExpYnJhcnkgYXMgZGlzdHJpYnV0ZWQgYnkgU2lsaWNvbmR1c3QsIG9yIGEKKyAqIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUKKyAqIGNvbmRpdGlvbnMgZGVmaW5lZCBpbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBub3RlczoKKyAqCisgKiBBUEkgc3BlY2lmaWVzIHRpbWVvdXQgZm9yIGVhY2ggb3BlcmF0aW9uIChvciB6ZXJvIGZvciBub24tYmxvY2tpbmcpLgorICoKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWx5IG9uIHRoZSBPUyBzb2NrZXQgdGltZW91dCBhcyB0aGlzIHdpbGwgZmFpbCB0bworICogZGV0ZWN0IHRoZSBjb21tYW5kLXJlc3BvbnNlIHNpdHVhdGlvbiB3aGVyZSBkYXRhIGlzIHNlbnQgc3VjY2Vzc2Z1bGx5IGFuZAorICogdGhlIG90aGVyIGVuZCBjaG9vc2VzIG5vdCB0byBzZW5kIGEgcmVzcG9uc2UgKG90aGVyIHRoYW4gdGhlIFRDUCBhY2spLgorICoKKyAqIFRoZSBzZWxlY3QoKSBjYW5ub3QgYmUgdXNlZCB3aXRoIGhpZ2ggc29ja2V0IG51bWJlcnMgKHR5cGljYWxseSBtYXggMTAyNCkKKyAqIHNvIHRoZSBjb2RlIHdvcmtzIGFzIGZvbGxvd3M6CisgKiAtIFVzZSBub24tYmxvY2tpbmcgc29ja2V0cyB0byBhbGxvdyBvcGVyYXRpb24gd2l0aG91dCBzZWxlY3QuCisgKiAtIFVzZSBzZWxlY3Qgd2hlcmUgc2FmZSAobG93IHNvY2tldCBudW1iZXJzKS4KKyAqIC0gUG9sbCB3aXRoIHNob3J0IHNsZWVwIHdoZW4gc2VsZWN0IGNhbm5vdCBiZSB1c2VkIHNhZmVseS4KKyAqLworCisjaW5jbHVkZSAiaGRob21lcnVuLmgiCisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2lmbmRlZiBTSU9DR0lGQ09ORgorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9TSVpFT0ZfQUREUl9JRlJFUQorI2RlZmluZSBfU0laRU9GX0FERFJfSUZSRVEoeCkgc2l6ZW9mKHgpCisjZW5kaWYKKworI2lmbmRlZiBNU0dfTk9TSUdOQUwKKyNkZWZpbmUgTVNHX05PU0lHTkFMIDAKKyNlbmRpZgorCitpbnQgaGRob21lcnVuX2xvY2FsX2lwX2luZm8oc3RydWN0IGhkaG9tZXJ1bl9sb2NhbF9pcF9pbmZvX3QgaXBfaW5mb19saXN0W10sIGludCBtYXhfY291bnQpCit7CisJaW50IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNvY2sgPT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJc3RydWN0IGlmY29uZiBpZmM7CisJc2l6ZV90IGlmcmVxX2J1ZmZlcl9zaXplID0gMTAyNDsKKworCXdoaWxlICgxKSB7CisJCWlmYy5pZmNfbGVuID0gaWZyZXFfYnVmZmVyX3NpemU7CisJCWlmYy5pZmNfYnVmID0gKGNoYXIgKiltYWxsb2MoaWZyZXFfYnVmZmVyX3NpemUpOworCQlpZiAoIWlmYy5pZmNfYnVmKSB7CisJCQljbG9zZShzb2NrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbXNldChpZmMuaWZjX2J1ZiwgMCwgaWZyZXFfYnVmZmVyX3NpemUpOworCisJCWlmIChpb2N0bChzb2NrLCBTSU9DR0lGQ09ORiwgJmlmYykgIT0gMCkgeworCQkJZnJlZShpZmMuaWZjX2J1Zik7CisJCQljbG9zZShzb2NrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChpZmMuaWZjX2xlbiA8IGlmcmVxX2J1ZmZlcl9zaXplKSB7CisJCQlicmVhazsKKwkJfQorCisJCWZyZWUoaWZjLmlmY19idWYpOworCQlpZnJlcV9idWZmZXJfc2l6ZSArPSAxMDI0OworCX0KKworCWNoYXIgKnB0ciA9IGlmYy5pZmNfYnVmOworCWNoYXIgKmVuZCA9IGlmYy5pZmNfYnVmICsgaWZjLmlmY19sZW47CisKKwlpbnQgY291bnQgPSAwOworCXdoaWxlIChwdHIgPD0gZW5kKSB7CisJCXN0cnVjdCBpZnJlcSAqaWZyID0gKHN0cnVjdCBpZnJlcSAqKXB0cjsKKwkJcHRyICs9IF9TSVpFT0ZfQUREUl9JRlJFUSgqaWZyKTsKKworCQlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkFERFIsIGlmcikgIT0gMCkgeworCQkJY29udGludWU7CisJCX0KKworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlwX2FkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJihpZnItPmlmcl9hZGRyKTsKKwkJdWludDMyX3QgaXBfYWRkciA9IG50b2hsKGlwX2FkZHJfaW4tPnNpbl9hZGRyLnNfYWRkcik7CisJCWlmIChpcF9hZGRyID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLLCBpZnIpICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3RydWN0IHNvY2thZGRyX2luICpzdWJuZXRfbWFza19pbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmKGlmci0+aWZyX2FkZHIpOworCQl1aW50MzJfdCBzdWJuZXRfbWFzayA9IG50b2hsKHN1Ym5ldF9tYXNrX2luLT5zaW5fYWRkci5zX2FkZHIpOworCisJCXN0cnVjdCBoZGhvbWVydW5fbG9jYWxfaXBfaW5mb190ICppcF9pbmZvID0gJmlwX2luZm9fbGlzdFtjb3VudCsrXTsKKwkJaXBfaW5mby0+aXBfYWRkciA9IGlwX2FkZHI7CisJCWlwX2luZm8tPnN1Ym5ldF9tYXNrID0gc3VibmV0X21hc2s7CisKKwkJaWYgKGNvdW50ID49IG1heF9jb3VudCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlKGlmYy5pZmNfYnVmKTsKKwljbG9zZShzb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK2hkaG9tZXJ1bl9zb2NrX3QgaGRob21lcnVuX3NvY2tfY3JlYXRlX3VkcCh2b2lkKQoreworCS8qIENyZWF0ZSBzb2NrZXQuICovCisJaGRob21lcnVuX3NvY2tfdCBzb2NrID0gKGhkaG9tZXJ1bl9zb2NrX3Qpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChzb2NrID09IC0xKSB7CisJCXJldHVybiBIREhPTUVSVU5fU09DS19JTlZBTElEOworCX0KKworCS8qIFNldCBub24tYmxvY2tpbmcgKi8KKwlpZiAoZmNudGwoc29jaywgRl9TRVRGTCwgT19OT05CTE9DSykgIT0gMCkgeworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIEhESE9NRVJVTl9TT0NLX0lOVkFMSUQ7CisJfQorCisJLyogQWxsb3cgYnJvYWRjYXN0LiAqLworCWludCBzb2NrX29wdCA9IDE7CisJc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsIChjaGFyICopJnNvY2tfb3B0LCBzaXplb2Yoc29ja19vcHQpKTsKKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIHNvY2s7Cit9CisKK2hkaG9tZXJ1bl9zb2NrX3QgaGRob21lcnVuX3NvY2tfY3JlYXRlX3RjcCh2b2lkKQoreworCS8qIENyZWF0ZSBzb2NrZXQuICovCisJaGRob21lcnVuX3NvY2tfdCBzb2NrID0gKGhkaG9tZXJ1bl9zb2NrX3Qpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoc29jayA9PSAtMSkgeworCQlyZXR1cm4gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKwl9CisKKwkvKiBTZXQgbm9uLWJsb2NraW5nICovCisJaWYgKGZjbnRsKHNvY2ssIEZfU0VURkwsIE9fTk9OQkxPQ0spICE9IDApIHsKKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiBIREhPTUVSVU5fU09DS19JTlZBTElEOworCX0KKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIHNvY2s7Cit9CisKK3ZvaWQgaGRob21lcnVuX3NvY2tfZGVzdHJveShoZGhvbWVydW5fc29ja190IHNvY2spCit7CisJY2xvc2Uoc29jayk7Cit9CisKK2ludCBoZGhvbWVydW5fc29ja19nZXRsYXN0ZXJyb3Iodm9pZCkKK3sKKwlyZXR1cm4gZXJybm87Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9zb2NrX2dldHNvY2tuYW1lX2FkZHIoaGRob21lcnVuX3NvY2tfdCBzb2NrKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7CisJc29ja2xlbl90IHNvY2thZGRyX3NpemUgPSBzaXplb2Yoc29ja19hZGRyKTsKKworCWlmIChnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tfYWRkciwgJnNvY2thZGRyX3NpemUpICE9IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIG50b2hsKHNvY2tfYWRkci5zaW5fYWRkci5zX2FkZHIpOworfQorCit1aW50MTZfdCBoZGhvbWVydW5fc29ja19nZXRzb2NrbmFtZV9wb3J0KGhkaG9tZXJ1bl9zb2NrX3Qgc29jaykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCXNvY2tsZW5fdCBzb2NrYWRkcl9zaXplID0gc2l6ZW9mKHNvY2tfYWRkcik7CisKKwlpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2FkZHIsICZzb2NrYWRkcl9zaXplKSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBudG9ocyhzb2NrX2FkZHIuc2luX3BvcnQpOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fc29ja19nZXRwZWVybmFtZV9hZGRyKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCXNvY2tsZW5fdCBzb2NrYWRkcl9zaXplID0gc2l6ZW9mKHNvY2tfYWRkcik7CisKKwlpZiAoZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2FkZHIsICZzb2NrYWRkcl9zaXplKSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBudG9obChzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKK30KKwordWludDMyX3QgaGRob21lcnVuX3NvY2tfZ2V0YWRkcmluZm9fYWRkcihoZGhvbWVydW5fc29ja190IHNvY2ssIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzOworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworCisJc3RydWN0IGFkZHJpbmZvICpzb2NrX2luZm87CisJaWYgKGdldGFkZHJpbmZvKG5hbWUsICIiLCAmaGludHMsICZzb2NrX2luZm8pICE9IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RydWN0IHNvY2thZGRyX2luICpzb2NrX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopc29ja19pbmZvLT5haV9hZGRyOworCXVpbnQzMl90IGFkZHIgPSBudG9obChzb2NrX2FkZHItPnNpbl9hZGRyLnNfYWRkcik7CisKKwlmcmVlYWRkcmluZm8oc29ja19pbmZvKTsKKwlyZXR1cm4gYWRkcjsKK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX2pvaW5fbXVsdGljYXN0X2dyb3VwKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbXVsdGljYXN0X2lwLCB1aW50MzJfdCBsb2NhbF9pcCkKK3sKKwlzdHJ1Y3QgaXBfbXJlcSBpbXI7CisJbWVtc2V0KCZpbXIsIDAsIHNpemVvZihpbXIpKTsKKwlpbXIuaW1yX211bHRpYWRkci5zX2FkZHIgID0gaHRvbmwobXVsdGljYXN0X2lwKTsKKwlpbXIuaW1yX2ludGVyZmFjZS5zX2FkZHIgID0gaHRvbmwobG9jYWxfaXApOworCisJaWYgKHNldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUCwgSVBfQUREX01FTUJFUlNISVAsIChjb25zdCBjaGFyICopJmltciwgc2l6ZW9mKGltcikpICE9IDApIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfbGVhdmVfbXVsdGljYXN0X2dyb3VwKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbXVsdGljYXN0X2lwLCB1aW50MzJfdCBsb2NhbF9pcCkKK3sKKwlzdHJ1Y3QgaXBfbXJlcSBpbXI7CisJbWVtc2V0KCZpbXIsIDAsIHNpemVvZihpbXIpKTsKKwlpbXIuaW1yX211bHRpYWRkci5zX2FkZHIgID0gaHRvbmwobXVsdGljYXN0X2lwKTsKKwlpbXIuaW1yX2ludGVyZmFjZS5zX2FkZHIgID0gaHRvbmwobG9jYWxfaXApOworCisJaWYgKHNldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUCwgSVBfRFJPUF9NRU1CRVJTSElQLCAoY29uc3QgY2hhciAqKSZpbXIsIHNpemVvZihpbXIpKSAhPSAwKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX2JpbmQoaGRob21lcnVuX3NvY2tfdCBzb2NrLCB1aW50MzJfdCBsb2NhbF9hZGRyLCB1aW50MTZfdCBsb2NhbF9wb3J0LCBib29sX3QgYWxsb3dfcmV1c2UpCit7CisJaW50IHNvY2tfb3B0ID0gYWxsb3dfcmV1c2U7CisJc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopJnNvY2tfb3B0LCBzaXplb2Yoc29ja19vcHQpKTsKKworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7CisJbWVtc2V0KCZzb2NrX2FkZHIsIDAsIHNpemVvZihzb2NrX2FkZHIpKTsKKwlzb2NrX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGxvY2FsX2FkZHIpOworCXNvY2tfYWRkci5zaW5fcG9ydCA9IGh0b25zKGxvY2FsX3BvcnQpOworCisJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2FkZHIsIHNpemVvZihzb2NrX2FkZHIpKSAhPSAwKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fc29ja193YWl0X2Zvcl9yZWFkX2V2ZW50KGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDY0X3Qgc3RvcF90aW1lKQoreworCXVpbnQ2NF90IGN1cnJlbnRfdGltZSA9IGdldGN1cnJlbnR0aW1lKCk7CisJaWYgKGN1cnJlbnRfdGltZSA+PSBzdG9wX3RpbWUpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChzb2NrIDwgRkRfU0VUU0laRSkgeworCQl1aW50NjRfdCB0aW1lb3V0ID0gc3RvcF90aW1lIC0gY3VycmVudF90aW1lOworCQlzdHJ1Y3QgdGltZXZhbCB0OworCQl0LnR2X3NlYyA9IHRpbWVvdXQgLyAxMDAwOworCQl0LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDApICogMTAwMDsKKworCQlmZF9zZXQgcmVhZGZkczsKKwkJRkRfWkVSTygmcmVhZGZkcyk7CisJCUZEX1NFVChzb2NrLCAmcmVhZGZkcyk7CisKKwkJZmRfc2V0IGVycm9yZmRzOworCQlGRF9aRVJPKCZlcnJvcmZkcyk7CisJCUZEX1NFVChzb2NrLCAmZXJyb3JmZHMpOworCisJCWlmIChzZWxlY3Qoc29jayArIDEsICZyZWFkZmRzLCBOVUxMLCAmZXJyb3JmZHMsICZ0KSA8PSAwKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJaWYgKCFGRF9JU1NFVChzb2NrLCAmcmVhZGZkcykpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCXVpbnQ2NF90IGRlbGF5ID0gc3RvcF90aW1lIC0gY3VycmVudF90aW1lOworCQlpZiAoZGVsYXkgPiA1KSB7CisJCQlkZWxheSA9IDU7CisJCX0KKworCQltc2xlZXBfYXBwcm94KGRlbGF5KTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGJvb2xfdCBoZGhvbWVydW5fc29ja193YWl0X2Zvcl93cml0ZV9ldmVudChoZGhvbWVydW5fc29ja190IHNvY2ssIHVpbnQ2NF90IHN0b3BfdGltZSkKK3sKKwl1aW50NjRfdCBjdXJyZW50X3RpbWUgPSBnZXRjdXJyZW50dGltZSgpOworCWlmIChjdXJyZW50X3RpbWUgPj0gc3RvcF90aW1lKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoc29jayA8IEZEX1NFVFNJWkUpIHsKKwkJdWludDY0X3QgdGltZW91dCA9IHN0b3BfdGltZSAtIGN1cnJlbnRfdGltZTsKKwkJc3RydWN0IHRpbWV2YWwgdDsKKwkJdC50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKwkJdC50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CisKKwkJZmRfc2V0IHdyaXRlZmRzOworCQlGRF9aRVJPKCZ3cml0ZWZkcyk7CisJCUZEX1NFVChzb2NrLCAmd3JpdGVmZHMpOworCisJCWZkX3NldCBlcnJvcmZkczsKKwkJRkRfWkVSTygmZXJyb3JmZHMpOworCQlGRF9TRVQoc29jaywgJmVycm9yZmRzKTsKKworCQlpZiAoc2VsZWN0KHNvY2sgKyAxLCBOVUxMLCAmd3JpdGVmZHMsICZlcnJvcmZkcywgJnQpIDw9IDApIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAoIUZEX0lTU0VUKHNvY2ssICZ3cml0ZWZkcykpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCXVpbnQ2NF90IGRlbGF5ID0gc3RvcF90aW1lIC0gY3VycmVudF90aW1lOworCQlpZiAoZGVsYXkgPiA1KSB7CisJCQlkZWxheSA9IDU7CisJCX0KKworCQltc2xlZXBfYXBwcm94KGRlbGF5KTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX2Nvbm5lY3QoaGRob21lcnVuX3NvY2tfdCBzb2NrLCB1aW50MzJfdCByZW1vdGVfYWRkciwgdWludDE2X3QgcmVtb3RlX3BvcnQsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwocmVtb3RlX2FkZHIpOworCXNvY2tfYWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKworCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSkgIT0gMCkgeworCQlpZiAoKGVycm5vICE9IEVBR0FJTikgJiYgKGVycm5vICE9IEVXT1VMREJMT0NLKSAmJiAoZXJybm8gIT0gRUlOUFJPR1JFU1MpKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwl1aW50NjRfdCBzdG9wX3RpbWUgPSBnZXRjdXJyZW50dGltZSgpICsgdGltZW91dDsKKworCXdoaWxlICgxKSB7CisJCWlmIChzZW5kKHNvY2ssIE5VTEwsIDAsIE1TR19OT1NJR05BTCkgPT0gMCkgeworCQkJcmV0dXJuIFRSVUU7CisJCX0KKworCQlpZiAoKGVycm5vICE9IEVBR0FJTikgJiYgKGVycm5vICE9IEVXT1VMREJMT0NLKSAmJiAoZXJybm8gIT0gRUlOUFJPR1JFU1MpICYmIChlcnJubyAhPSBFTk9UQ09OTikpIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCWlmICghaGRob21lcnVuX3NvY2tfd2FpdF9mb3Jfd3JpdGVfZXZlbnQoc29jaywgc3RvcF90aW1lKSkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfc2VuZChoZGhvbWVydW5fc29ja190IHNvY2ssIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJdWludDY0X3Qgc3RvcF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIHRpbWVvdXQ7CisJY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IHNlbmQoc29jaywgcHRyLCBsZW5ndGgsIE1TR19OT1NJR05BTCk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKChlcnJubyAhPSBFQUdBSU4pICYmIChlcnJubyAhPSBFV09VTERCTE9DSykgJiYgKGVycm5vICE9IEVJTlBST0dSRVNTKSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWlmICghaGRob21lcnVuX3NvY2tfd2FpdF9mb3Jfd3JpdGVfZXZlbnQoc29jaywgc3RvcF90aW1lKSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJldCA8IChpbnQpbGVuZ3RoKSB7CisJCQlwdHIgKz0gcmV0OworCQkJbGVuZ3RoIC09IHJldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfc2VuZHRvKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgcmVtb3RlX2FkZHIsIHVpbnQxNl90IHJlbW90ZV9wb3J0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoLCB1aW50NjRfdCB0aW1lb3V0KQoreworCXVpbnQ2NF90IHN0b3BfdGltZSA9IGdldGN1cnJlbnR0aW1lKCkgKyB0aW1lb3V0OworCWNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7CisJCW1lbXNldCgmc29ja19hZGRyLCAwLCBzaXplb2Yoc29ja19hZGRyKSk7CisJCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHJlbW90ZV9hZGRyKTsKKwkJc29ja19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlX3BvcnQpOworCisJCWludCByZXQgPSBzZW5kdG8oc29jaywgcHRyLCBsZW5ndGgsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSk7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKChlcnJubyAhPSBFQUdBSU4pICYmIChlcnJubyAhPSBFV09VTERCTE9DSykgJiYgKGVycm5vICE9IEVJTlBST0dSRVNTKSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWlmICghaGRob21lcnVuX3NvY2tfd2FpdF9mb3Jfd3JpdGVfZXZlbnQoc29jaywgc3RvcF90aW1lKSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJldCA8IChpbnQpbGVuZ3RoKSB7CisJCQlwdHIgKz0gcmV0OworCQkJbGVuZ3RoIC09IHJldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfcmVjdihoZGhvbWVydW5fc29ja190IHNvY2ssIHZvaWQgKmRhdGEsIHNpemVfdCAqbGVuZ3RoLCB1aW50NjRfdCB0aW1lb3V0KQoreworCXVpbnQ2NF90IHN0b3BfdGltZSA9IGdldGN1cnJlbnR0aW1lKCkgKyB0aW1lb3V0OworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IHJlY3Yoc29jaywgZGF0YSwgKmxlbmd0aCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoKGVycm5vICE9IEVBR0FJTikgJiYgKGVycm5vICE9IEVXT1VMREJMT0NLKSAmJiAoZXJybm8gIT0gRUlOUFJPR1JFU1MpKSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJaWYgKCFoZGhvbWVydW5fc29ja193YWl0X2Zvcl9yZWFkX2V2ZW50KHNvY2ssIHN0b3BfdGltZSkpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJKmxlbmd0aCA9IHJldDsKKwkJcmV0dXJuIFRSVUU7CisJfQorfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfcmVjdmZyb20oaGRob21lcnVuX3NvY2tfdCBzb2NrLCB1aW50MzJfdCAqcmVtb3RlX2FkZHIsIHVpbnQxNl90ICpyZW1vdGVfcG9ydCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpsZW5ndGgsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJdWludDY0X3Qgc3RvcF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIHRpbWVvdXQ7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCQltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCQlzb2NrbGVuX3Qgc29ja2FkZHJfc2l6ZSA9IHNpemVvZihzb2NrX2FkZHIpOworCisJCWludCByZXQgPSByZWN2ZnJvbShzb2NrLCBkYXRhLCAqbGVuZ3RoLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tfYWRkciwgJnNvY2thZGRyX3NpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKChlcnJubyAhPSBFQUdBSU4pICYmIChlcnJubyAhPSBFV09VTERCTE9DSykgJiYgKGVycm5vICE9IEVJTlBST0dSRVNTKSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWlmICghaGRob21lcnVuX3NvY2tfd2FpdF9mb3JfcmVhZF9ldmVudChzb2NrLCBzdG9wX3RpbWUpKSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCSpyZW1vdGVfYWRkciA9IG50b2hsKHNvY2tfYWRkci5zaW5fYWRkci5zX2FkZHIpOworCQkqcmVtb3RlX3BvcnQgPSBudG9ocyhzb2NrX2FkZHIuc2luX3BvcnQpOworCQkqbGVuZ3RoID0gcmV0OworCQlyZXR1cm4gVFJVRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX3NvY2tfd2luZG93cy5jIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9zb2NrX3dpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTk5Njk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl9zb2NrX3dpbmRvd3MuYwpAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIGhkaG9tZXJ1bl9zb2NrX3dpbmRvd3MuYworICoKKyAqIENvcHlyaWdodCDCqSAyMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG5vdGVzOgorICoKKyAqIEFQSSBzcGVjaWZpZXMgdGltZW91dCBmb3IgZWFjaCBvcGVyYXRpb24gKG9yIHplcm8gZm9yIG5vbi1ibG9ja2luZykuCisgKgorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlbHkgb24gdGhlIE9TIHNvY2tldCB0aW1lb3V0IGFzIHRoaXMgd2lsbCBmYWlsIHRvCisgKiBkZXRlY3QgdGhlIGNvbW1hbmQtcmVzcG9uc2Ugc2l0dWF0aW9uIHdoZXJlIGRhdGEgaXMgc2VudCBzdWNjZXNzZnVsbHkgYW5kCisgKiB0aGUgb3RoZXIgZW5kIGNob29zZXMgbm90IHRvIHNlbmQgYSByZXNwb25zZSAob3RoZXIgdGhhbiB0aGUgVENQIGFjaykuCisgKgorICogV2luZG93cyBzdXBwb3J0cyBzZWxlY3QoKSBob3dldmVyIG5hdGl2ZSBXU0EgZXZlbnRzIGFyZSB1c2VkIHRvOgorICogLSBhdm9pZCBwcm9ibGVtcyB3aXRoIHNvY2tldCBudW1iZXJzIGFib3ZlIDEwMjQuCisgKiAtIHdhaXQgd2l0aG91dCBhbGxvd2luZyBvdGhlciBldmVudHMgaGFuZGxlcnMgdG8gcnVuIChpbXBvcnRhbnQgZm9yIHVzZQorICogICB3aXRoIHdpbjcgV01DKS4KKyAqLworCisjaW5jbHVkZSAiaGRob21lcnVuLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGlwaGxwYXBpLmg+CisKK2ludCBoZGhvbWVydW5fbG9jYWxfaXBfaW5mbyhzdHJ1Y3QgaGRob21lcnVuX2xvY2FsX2lwX2luZm9fdCBpcF9pbmZvX2xpc3RbXSwgaW50IG1heF9jb3VudCkKK3sKKwlQSVBfQURBUFRFUl9JTkZPIEFkYXB0ZXJJbmZvOworCVVMT05HIEFkYXB0ZXJJbmZvTGVuZ3RoID0gc2l6ZW9mKElQX0FEQVBURVJfSU5GTykgKiAxNjsKKworCXdoaWxlICgxKSB7CisJCUFkYXB0ZXJJbmZvID0gKElQX0FEQVBURVJfSU5GTyAqKW1hbGxvYyhBZGFwdGVySW5mb0xlbmd0aCk7CisJCWlmICghQWRhcHRlckluZm8pIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCVVMT05HIExlbmd0aE5lZWRlZCA9IEFkYXB0ZXJJbmZvTGVuZ3RoOworCQlEV09SRCBSZXQgPSBHZXRBZGFwdGVyc0luZm8oQWRhcHRlckluZm8sICZMZW5ndGhOZWVkZWQpOworCQlpZiAoUmV0ID09IE5PX0VSUk9SKSB7CisJCQlicmVhazsKKwkJfQorCisJCWZyZWUoQWRhcHRlckluZm8pOworCisJCWlmIChSZXQgIT0gRVJST1JfQlVGRkVSX09WRVJGTE9XKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKEFkYXB0ZXJJbmZvTGVuZ3RoID49IExlbmd0aE5lZWRlZCkgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJQWRhcHRlckluZm9MZW5ndGggPSBMZW5ndGhOZWVkZWQ7CisJfQorCisJaW50IGNvdW50ID0gMDsKKwlQSVBfQURBUFRFUl9JTkZPIEFkYXB0ZXIgPSBBZGFwdGVySW5mbzsKKwl3aGlsZSAoQWRhcHRlcikgeworCQlJUF9BRERSX1NUUklORyAqSVBBZGRyID0gJkFkYXB0ZXItPklwQWRkcmVzc0xpc3Q7CisJCXdoaWxlIChJUEFkZHIpIHsKKwkJCXVpbnQzMl90IGlwX2FkZHIgPSBudG9obChpbmV0X2FkZHIoSVBBZGRyLT5JcEFkZHJlc3MuU3RyaW5nKSk7CisJCQl1aW50MzJfdCBzdWJuZXRfbWFzayA9IG50b2hsKGluZXRfYWRkcihJUEFkZHItPklwTWFzay5TdHJpbmcpKTsKKworCQkJaWYgKGlwX2FkZHIgPT0gMCkgeworCQkJCUlQQWRkciA9IElQQWRkci0+TmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3RydWN0IGhkaG9tZXJ1bl9sb2NhbF9pcF9pbmZvX3QgKmlwX2luZm8gPSAmaXBfaW5mb19saXN0W2NvdW50KytdOworCQkJaXBfaW5mby0+aXBfYWRkciA9IGlwX2FkZHI7CisJCQlpcF9pbmZvLT5zdWJuZXRfbWFzayA9IHN1Ym5ldF9tYXNrOworCisJCQlpZiAoY291bnQgPj0gbWF4X2NvdW50KSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCUlQQWRkciA9IElQQWRkci0+TmV4dDsKKwkJfQorCisJCWlmIChjb3VudCA+PSBtYXhfY291bnQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJQWRhcHRlciA9IEFkYXB0ZXItPk5leHQ7CisJfQorCisJZnJlZShBZGFwdGVySW5mbyk7CisJcmV0dXJuIGNvdW50OworfQorCitoZGhvbWVydW5fc29ja190IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV91ZHAodm9pZCkKK3sKKwkvKiBDcmVhdGUgc29ja2V0LiAqLworCWhkaG9tZXJ1bl9zb2NrX3Qgc29jayA9IChoZGhvbWVydW5fc29ja190KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoc29jayA9PSAtMSkgeworCQlyZXR1cm4gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKwl9CisKKwkvKiBTZXQgbm9uLWJsb2NraW5nICovCisJdW5zaWduZWQgbG9uZyBtb2RlID0gMTsKKwlpZiAoaW9jdGxzb2NrZXQoc29jaywgRklPTkJJTywgJm1vZGUpICE9IDApIHsKKwkJY2xvc2Vzb2NrZXQoc29jayk7CisJCXJldHVybiBIREhPTUVSVU5fU09DS19JTlZBTElEOworCX0KKworCS8qIEFsbG93IGJyb2FkY2FzdC4gKi8KKwlpbnQgc29ja19vcHQgPSAxOworCXNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAoY2hhciAqKSZzb2NrX29wdCwgc2l6ZW9mKHNvY2tfb3B0KSk7CisKKwkvKiBTdWNjZXNzLiAqLworCXJldHVybiBzb2NrOworfQorCitoZGhvbWVydW5fc29ja190IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV90Y3Aodm9pZCkKK3sKKwkvKiBDcmVhdGUgc29ja2V0LiAqLworCWhkaG9tZXJ1bl9zb2NrX3Qgc29jayA9IChoZGhvbWVydW5fc29ja190KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2sgPT0gLTEpIHsKKwkJcmV0dXJuIEhESE9NRVJVTl9TT0NLX0lOVkFMSUQ7CisJfQorCisJLyogU2V0IG5vbi1ibG9ja2luZyAqLworCXVuc2lnbmVkIGxvbmcgbW9kZSA9IDE7CisJaWYgKGlvY3Rsc29ja2V0KHNvY2ssIEZJT05CSU8sICZtb2RlKSAhPSAwKSB7CisJCWNsb3Nlc29ja2V0KHNvY2spOworCQlyZXR1cm4gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKwl9CisKKwkvKiBTdWNjZXNzLiAqLworCXJldHVybiBzb2NrOworfQorCit2b2lkIGhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3koaGRob21lcnVuX3NvY2tfdCBzb2NrKQoreworCWNsb3Nlc29ja2V0KHNvY2spOworfQorCitpbnQgaGRob21lcnVuX3NvY2tfZ2V0bGFzdGVycm9yKHZvaWQpCit7CisJcmV0dXJuIFdTQUdldExhc3RFcnJvcigpOworfQorCit1aW50MzJfdCBoZGhvbWVydW5fc29ja19nZXRzb2NrbmFtZV9hZGRyKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCWludCBzb2NrYWRkcl9zaXplID0gc2l6ZW9mKHNvY2tfYWRkcik7CisKKwlpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2FkZHIsICZzb2NrYWRkcl9zaXplKSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBudG9obChzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKK30KKwordWludDE2X3QgaGRob21lcnVuX3NvY2tfZ2V0c29ja25hbWVfcG9ydChoZGhvbWVydW5fc29ja190IHNvY2spCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwlpbnQgc29ja2FkZHJfc2l6ZSA9IHNpemVvZihzb2NrX2FkZHIpOworCisJaWYgKGdldHNvY2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCAmc29ja2FkZHJfc2l6ZSkgIT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbnRvaHMoc29ja19hZGRyLnNpbl9wb3J0KTsKK30KKwordWludDMyX3QgaGRob21lcnVuX3NvY2tfZ2V0cGVlcm5hbWVfYWRkcihoZGhvbWVydW5fc29ja190IHNvY2spCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwlpbnQgc29ja2FkZHJfc2l6ZSA9IHNpemVvZihzb2NrX2FkZHIpOworCisJaWYgKGdldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCAmc29ja2FkZHJfc2l6ZSkgIT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbnRvaGwoc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkcik7Cit9CisKK3VpbnQzMl90IGhkaG9tZXJ1bl9zb2NrX2dldGFkZHJpbmZvX2FkZHIoaGRob21lcnVuX3NvY2tfdCBzb2NrLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKworCXN0cnVjdCBhZGRyaW5mbyAqc29ja19pbmZvOworCWlmIChnZXRhZGRyaW5mbyhuYW1lLCAiIiwgJmhpbnRzLCAmc29ja19pbmZvKSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc29ja19hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNvY2tfaW5mby0+YWlfYWRkcjsKKwl1aW50MzJfdCBhZGRyID0gbnRvaGwoc29ja19hZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCisJZnJlZWFkZHJpbmZvKHNvY2tfaW5mbyk7CisJcmV0dXJuIGFkZHI7Cit9CisKK2Jvb2xfdCBoZGhvbWVydW5fc29ja19qb2luX211bHRpY2FzdF9ncm91cChoZGhvbWVydW5fc29ja190IHNvY2ssIHVpbnQzMl90IG11bHRpY2FzdF9pcCwgdWludDMyX3QgbG9jYWxfaXApCit7CisJc3RydWN0IGlwX21yZXEgaW1yOworCW1lbXNldCgmaW1yLCAwLCBzaXplb2YoaW1yKSk7CisJaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyICA9IGh0b25sKG11bHRpY2FzdF9pcCk7CisJaW1yLmltcl9pbnRlcmZhY2Uuc19hZGRyICA9IGh0b25sKGxvY2FsX2lwKTsKKworCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVAsIElQX0FERF9NRU1CRVJTSElQLCAoY29uc3QgY2hhciAqKSZpbXIsIHNpemVvZihpbXIpKSAhPSAwKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX2xlYXZlX211bHRpY2FzdF9ncm91cChoZGhvbWVydW5fc29ja190IHNvY2ssIHVpbnQzMl90IG11bHRpY2FzdF9pcCwgdWludDMyX3QgbG9jYWxfaXApCit7CisJc3RydWN0IGlwX21yZXEgaW1yOworCW1lbXNldCgmaW1yLCAwLCBzaXplb2YoaW1yKSk7CisJaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyICA9IGh0b25sKG11bHRpY2FzdF9pcCk7CisJaW1yLmltcl9pbnRlcmZhY2Uuc19hZGRyICA9IGh0b25sKGxvY2FsX2lwKTsKKworCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVAsIElQX0RST1BfTUVNQkVSU0hJUCwgKGNvbnN0IGNoYXIgKikmaW1yLCBzaXplb2YoaW1yKSkgIT0gMCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK2Jvb2xfdCBoZGhvbWVydW5fc29ja19iaW5kKGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgbG9jYWxfYWRkciwgdWludDE2X3QgbG9jYWxfcG9ydCwgYm9vbF90IGFsbG93X3JldXNlKQoreworCWludCBzb2NrX29wdCA9IGFsbG93X3JldXNlOworCXNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoY2hhciAqKSZzb2NrX29wdCwgc2l6ZW9mKHNvY2tfb3B0KSk7CisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCW1lbXNldCgmc29ja19hZGRyLCAwLCBzaXplb2Yoc29ja19hZGRyKSk7CisJc29ja19hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNvY2tfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChsb2NhbF9hZGRyKTsKKwlzb2NrX2FkZHIuc2luX3BvcnQgPSBodG9ucyhsb2NhbF9wb3J0KTsKKworCWlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSkgIT0gMCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK2Jvb2xfdCBoZGhvbWVydW5fc29ja19jb25uZWN0KGhkaG9tZXJ1bl9zb2NrX3Qgc29jaywgdWludDMyX3QgcmVtb3RlX2FkZHIsIHVpbnQxNl90IHJlbW90ZV9wb3J0LCB1aW50NjRfdCB0aW1lb3V0KQoreworCS8qIENvbm5lY3QgKG5vbi1ibG9ja2luZykuICovCisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwocmVtb3RlX2FkZHIpOworCXNvY2tfYWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKworCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSkgIT0gMCkgeworCQlpZiAoV1NBR2V0TGFzdEVycm9yKCkgIT0gV1NBRVdPVUxEQkxPQ0spIHsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIGNvbm5lY3QgdG8gY29tcGxldGUgKGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSB3aWxsIHNpZ25hbCkuICovCisJV1NBRVZFTlQgd3NhX2V2ZW50ID0gV1NBQ3JlYXRlRXZlbnQoKTsKKwlpZiAod3NhX2V2ZW50ID09IFdTQV9JTlZBTElEX0VWRU5UKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoV1NBRXZlbnRTZWxlY3Qoc29jaywgd3NhX2V2ZW50LCBGRF9XUklURSB8IEZEX0NMT1NFKSA9PSBTT0NLRVRfRVJST1IpIHsKKwkJV1NBQ2xvc2VFdmVudCh3c2FfZXZlbnQpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJRFdPUkQgcmV0ID0gV2FpdEZvclNpbmdsZU9iamVjdEV4KHdzYV9ldmVudCwgKERXT1JEKXRpbWVvdXQsIEZBTFNFKTsKKwlXU0FDbG9zZUV2ZW50KHdzYV9ldmVudCk7CisJaWYgKHJldCAhPSBXQUlUX09CSkVDVF8wKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKiBEZXRlY3Qgc3VjY2Vzcy9mYWlsdXJlLiAqLworCXdzYV9ldmVudCA9IFdTQUNyZWF0ZUV2ZW50KCk7CisJaWYgKHdzYV9ldmVudCA9PSBXU0FfSU5WQUxJRF9FVkVOVCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKFdTQUV2ZW50U2VsZWN0KHNvY2ssIHdzYV9ldmVudCwgRkRfQ0xPU0UpID09IFNPQ0tFVF9FUlJPUikgeworCQlXU0FDbG9zZUV2ZW50KHdzYV9ldmVudCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgod3NhX2V2ZW50LCAwLCBGQUxTRSk7CisJV1NBQ2xvc2VFdmVudCh3c2FfZXZlbnQpOworCWlmIChyZXQgPT0gV0FJVF9PQkpFQ1RfMCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBib29sX3QgaGRob21lcnVuX3NvY2tfd2FpdF9mb3JfZXZlbnQoaGRob21lcnVuX3NvY2tfdCBzb2NrLCBsb25nIGV2ZW50X3R5cGUsIHVpbnQ2NF90IHN0b3BfdGltZSkKK3sKKwl1aW50NjRfdCBjdXJyZW50X3RpbWUgPSBnZXRjdXJyZW50dGltZSgpOworCWlmIChjdXJyZW50X3RpbWUgPj0gc3RvcF90aW1lKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlXU0FFVkVOVCB3c2FfZXZlbnQgPSBXU0FDcmVhdGVFdmVudCgpOworCWlmICh3c2FfZXZlbnQgPT0gV1NBX0lOVkFMSURfRVZFTlQpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChXU0FFdmVudFNlbGVjdChzb2NrLCB3c2FfZXZlbnQsIGV2ZW50X3R5cGUpID09IFNPQ0tFVF9FUlJPUikgeworCQlXU0FDbG9zZUV2ZW50KHdzYV9ldmVudCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEV09SRCByZXQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgod3NhX2V2ZW50LCAoRFdPUkQpKHN0b3BfdGltZSAtIGN1cnJlbnRfdGltZSksIEZBTFNFKTsKKwlXU0FDbG9zZUV2ZW50KHdzYV9ldmVudCk7CisKKwlpZiAocmV0ICE9IFdBSVRfT0JKRUNUXzApIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfc2VuZChoZGhvbWVydW5fc29ja190IHNvY2ssIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJdWludDY0X3Qgc3RvcF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIHRpbWVvdXQ7CisJY29uc3QgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IHNlbmQoc29jaywgKGNoYXIgKilwdHIsIChpbnQpbGVuZ3RoLCAwKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlpZiAoV1NBR2V0TGFzdEVycm9yKCkgIT0gV1NBRVdPVUxEQkxPQ0spIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlpZiAoIWhkaG9tZXJ1bl9zb2NrX3dhaXRfZm9yX2V2ZW50KHNvY2ssIEZEX1dSSVRFIHwgRkRfQ0xPU0UsIHN0b3BfdGltZSkpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPCAoaW50KWxlbmd0aCkgeworCQkJcHRyICs9IHJldDsKKwkJCWxlbmd0aCAtPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX3NlbmR0byhoZGhvbWVydW5fc29ja190IHNvY2ssIHVpbnQzMl90IHJlbW90ZV9hZGRyLCB1aW50MTZfdCByZW1vdGVfcG9ydCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgdWludDY0X3QgdGltZW91dCkKK3sKKwl1aW50NjRfdCBzdG9wX3RpbWUgPSBnZXRjdXJyZW50dGltZSgpICsgdGltZW91dDsKKwljb25zdCB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCQltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCQlzb2NrX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNvY2tfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChyZW1vdGVfYWRkcik7CisJCXNvY2tfYWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKworCQlpbnQgcmV0ID0gc2VuZHRvKHNvY2ssIChjaGFyICopcHRyLCAoaW50KWxlbmd0aCwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2FkZHIsIHNpemVvZihzb2NrX2FkZHIpKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlpZiAoV1NBR2V0TGFzdEVycm9yKCkgIT0gV1NBRVdPVUxEQkxPQ0spIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlpZiAoIWhkaG9tZXJ1bl9zb2NrX3dhaXRfZm9yX2V2ZW50KHNvY2ssIEZEX1dSSVRFIHwgRkRfQ0xPU0UsIHN0b3BfdGltZSkpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPCAoaW50KWxlbmd0aCkgeworCQkJcHRyICs9IHJldDsKKwkJCWxlbmd0aCAtPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KK30KKworYm9vbF90IGhkaG9tZXJ1bl9zb2NrX3JlY3YoaGRob21lcnVuX3NvY2tfdCBzb2NrLCB2b2lkICpkYXRhLCBzaXplX3QgKmxlbmd0aCwgdWludDY0X3QgdGltZW91dCkKK3sKKwl1aW50NjRfdCBzdG9wX3RpbWUgPSBnZXRjdXJyZW50dGltZSgpICsgdGltZW91dDsKKworCXdoaWxlICgxKSB7CisJCWludCByZXQgPSByZWN2KHNvY2ssIChjaGFyICopZGF0YSwgKGludCkoKmxlbmd0aCksIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKFdTQUdldExhc3RFcnJvcigpICE9IFdTQUVXT1VMREJMT0NLKSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJaWYgKCFoZGhvbWVydW5fc29ja193YWl0X2Zvcl9ldmVudChzb2NrLCBGRF9SRUFEIHwgRkRfQ0xPU0UsIHN0b3BfdGltZSkpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJKmxlbmd0aCA9IHJldDsKKwkJcmV0dXJuIFRSVUU7CisJfQorfQorCitib29sX3QgaGRob21lcnVuX3NvY2tfcmVjdmZyb20oaGRob21lcnVuX3NvY2tfdCBzb2NrLCB1aW50MzJfdCAqcmVtb3RlX2FkZHIsIHVpbnQxNl90ICpyZW1vdGVfcG9ydCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpsZW5ndGgsIHVpbnQ2NF90IHRpbWVvdXQpCit7CisJdWludDY0X3Qgc3RvcF90aW1lID0gZ2V0Y3VycmVudHRpbWUoKSArIHRpbWVvdXQ7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja19hZGRyOworCQltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCQlpbnQgc29ja2FkZHJfc2l6ZSA9IHNpemVvZihzb2NrX2FkZHIpOworCisJCWludCByZXQgPSByZWN2ZnJvbShzb2NrLCAoY2hhciAqKWRhdGEsIChpbnQpKCpsZW5ndGgpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2tfYWRkciwgJnNvY2thZGRyX3NpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKFdTQUdldExhc3RFcnJvcigpICE9IFdTQUVXT1VMREJMT0NLKSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJaWYgKCFoZGhvbWVydW5fc29ja193YWl0X2Zvcl9ldmVudChzb2NrLCBGRF9SRUFEIHwgRkRfQ0xPU0UsIHN0b3BfdGltZSkpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJKnJlbW90ZV9hZGRyID0gbnRvaGwoc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkcik7CisJCSpyZW1vdGVfcG9ydCA9IG50b2hzKHNvY2tfYWRkci5zaW5fcG9ydCk7CisJCSpsZW5ndGggPSByZXQ7CisJCXJldHVybiBUUlVFOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fdHlwZXMuaCBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDBlYjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl90eXBlcy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBoZGhvbWVydW5fdHlwZXMuaAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA4LTIwMDkgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEhESE9NRVJVTl9TVEFUVVNfQ09MT1JfTkVVVFJBTAkweEZGRkZGRkZGCisjZGVmaW5lIEhESE9NRVJVTl9TVEFUVVNfQ09MT1JfUkVECQkweEZGRkYwMDAwCisjZGVmaW5lIEhESE9NRVJVTl9TVEFUVVNfQ09MT1JfWUVMTE9XCTB4RkZGRkZGMDAKKyNkZWZpbmUgSERIT01FUlVOX1NUQVRVU19DT0xPUl9HUkVFTgkweEZGMDBDMDAwCisKK3N0cnVjdCBoZGhvbWVydW5fZGV2aWNlX3Q7CitzdHJ1Y3QgaGRob21lcnVuX2RldmljZV9hbGxvY2F0aW9uX3Q7CisKK3N0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3QgeworCWNoYXIgY2hhbm5lbFszMl07CisJY2hhciBsb2NrX3N0clszMl07CisJYm9vbF90IHNpZ25hbF9wcmVzZW50OworCWJvb2xfdCBsb2NrX3N1cHBvcnRlZDsKKwlib29sX3QgbG9ja191bnN1cHBvcnRlZDsKKwl1bnNpZ25lZCBpbnQgc2lnbmFsX3N0cmVuZ3RoOworCXVuc2lnbmVkIGludCBzaWduYWxfdG9fbm9pc2VfcXVhbGl0eTsKKwl1bnNpZ25lZCBpbnQgc3ltYm9sX2Vycm9yX3F1YWxpdHk7CisJdWludDMyX3QgcmF3X2JpdHNfcGVyX3NlY29uZDsKKwl1aW50MzJfdCBwYWNrZXRzX3Blcl9zZWNvbmQ7Cit9OworCitzdHJ1Y3QgaGRob21lcnVuX3R1bmVyX3ZzdGF0dXNfdCB7CisJY2hhciB2Y2hhbm5lbFszMl07CisJY2hhciBuYW1lWzMyXTsKKwljaGFyIGF1dGhbMzJdOworCWNoYXIgY2NpWzMyXTsKKwljaGFyIGNnbXNbMzJdOworCWJvb2xfdCBub3Rfc3Vic2NyaWJlZDsKKwlib29sX3Qgbm90X2F2YWlsYWJsZTsKKwlib29sX3QgY29weV9wcm90ZWN0ZWQ7Cit9OworCitzdHJ1Y3QgaGRob21lcnVuX2NoYW5uZWxzY2FuX3Byb2dyYW1fdCB7CisJY2hhciBwcm9ncmFtX3N0cls2NF07CisJdWludDE2X3QgcHJvZ3JhbV9udW1iZXI7CisJdWludDE2X3QgdmlydHVhbF9tYWpvcjsKKwl1aW50MTZfdCB2aXJ0dWFsX21pbm9yOworCXVpbnQxNl90IHR5cGU7CisJY2hhciBuYW1lWzMyXTsKK307CisKKyNkZWZpbmUgSERIT01FUlVOX0NIQU5ORUxTQ0FOX01BWF9QUk9HUkFNX0NPVU5UIDY0CisKK3N0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fcmVzdWx0X3QgeworCWNoYXIgY2hhbm5lbF9zdHJbNjRdOworCXVpbnQzMl90IGNoYW5uZWxtYXA7CisJdWludDMyX3QgZnJlcXVlbmN5OworCXN0cnVjdCBoZGhvbWVydW5fdHVuZXJfc3RhdHVzX3Qgc3RhdHVzOworCWludCBwcm9ncmFtX2NvdW50OworCXN0cnVjdCBoZGhvbWVydW5fY2hhbm5lbHNjYW5fcHJvZ3JhbV90IHByb2dyYW1zW0hESE9NRVJVTl9DSEFOTkVMU0NBTl9NQVhfUFJPR1JBTV9DT1VOVF07CisJYm9vbF90IHRyYW5zcG9ydF9zdHJlYW1faWRfZGV0ZWN0ZWQ7CisJdWludDE2X3QgdHJhbnNwb3J0X3N0cmVhbV9pZDsKK307CisKK3N0cnVjdCBoZGhvbWVydW5fcGxvdHNhbXBsZV90IHsKKwlpbnQxNl90IHJlYWw7CisJaW50MTZfdCBpbWFnOworfTsKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fdmlkZW8uYyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MmI4ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2hkaG9tZXJ1bl92aWRlby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogaGRob21lcnVuX3ZpZGVvLmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDEwIFNpbGljb25kdXN0IFVTQSBJbmMuIDx3d3cuc2lsaWNvbmR1c3QuY29tPi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIAorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogeW91IG1heSBsaW5rLCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBhbiBhcHBsaWNhdGlvbiB3aXRoIGEKKyAqIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhbgorICogZXhlY3V0YWJsZSBmaWxlIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGF0IGV4ZWN1dGFibGUgZmlsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwKKyAqIHdpdGhvdXQgYW55IG9mIHRoZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gY2xhdXNlIDQgb2YKKyAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEJ5ICJhIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkiLCB3ZSBtZWFuCisgKiBlaXRoZXIgdGhlIHVubW9kaWZpZWQgTGlicmFyeSBhcyBkaXN0cmlidXRlZCBieSBTaWxpY29uZHVzdCwgb3IgYQorICogbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogY29uZGl0aW9ucyBkZWZpbmVkIGluIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImhkaG9tZXJ1bi5oIgorCitzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCB7CisJcHRocmVhZF9tdXRleF90IGxvY2s7CisJc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmc7CisJaGRob21lcnVuX3NvY2tfdCBzb2NrOworCisJdm9sYXRpbGUgc2l6ZV90IGhlYWQ7CisJdm9sYXRpbGUgc2l6ZV90IHRhaWw7CisJdWludDhfdCAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwlzaXplX3QgYWR2YW5jZTsKKworCXB0aHJlYWRfdCB0aHJlYWQ7CisJdm9sYXRpbGUgYm9vbF90IHRlcm1pbmF0ZTsKKworCXZvbGF0aWxlIHVpbnQzMl90IHBhY2tldF9jb3VudDsKKwl2b2xhdGlsZSB1aW50MzJfdCB0cmFuc3BvcnRfZXJyb3JfY291bnQ7CisJdm9sYXRpbGUgdWludDMyX3QgbmV0d29ya19lcnJvcl9jb3VudDsKKwl2b2xhdGlsZSB1aW50MzJfdCBzZXF1ZW5jZV9lcnJvcl9jb3VudDsKKwl2b2xhdGlsZSB1aW50MzJfdCBvdmVyZmxvd19lcnJvcl9jb3VudDsKKworCXZvbGF0aWxlIHVpbnQzMl90IHJ0cF9zZXF1ZW5jZTsKKwl2b2xhdGlsZSB1aW50OF90IHNlcXVlbmNlWzB4MjAwMF07Cit9OworCitzdGF0aWMgVEhSRUFEX0ZVTkNfUFJFRklYIGhkaG9tZXJ1bl92aWRlb190aHJlYWRfZXhlY3V0ZSh2b2lkICphcmcpOworCitzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqaGRob21lcnVuX3ZpZGVvX2NyZWF0ZSh1aW50MTZfdCBsaXN0ZW5fcG9ydCwgYm9vbF90IGFsbG93X3BvcnRfcmV1c2UsIHNpemVfdCBidWZmZXJfc2l6ZSwgc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmcpCit7CisJLyogQ3JlYXRlIG9iamVjdC4gKi8KKwlzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMgPSAoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190KSk7CisJaWYgKCF2cykgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGRiZywgImhkaG9tZXJ1bl92aWRlb19jcmVhdGU6IGZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBvYmplY3RcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2cy0+ZGJnID0gZGJnOworCXZzLT5zb2NrID0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRDsKKwlwdGhyZWFkX211dGV4X2luaXQoJnZzLT5sb2NrLCBOVUxMKTsKKworCS8qIFJlc2V0IHNlcXVlbmNlIHRyYWNraW5nLiAqLworCWhkaG9tZXJ1bl92aWRlb19mbHVzaCh2cyk7CisKKwkvKiBCdWZmZXIgc2l6ZS4gKi8KKwl2cy0+YnVmZmVyX3NpemUgPSAoYnVmZmVyX3NpemUgLyBWSURFT19EQVRBX1BBQ0tFVF9TSVpFKSAqIFZJREVPX0RBVEFfUEFDS0VUX1NJWkU7CisJaWYgKHZzLT5idWZmZXJfc2l6ZSA9PSAwKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoZGJnLCAiaGRob21lcnVuX3ZpZGVvX2NyZWF0ZTogaW52YWxpZCBidWZmZXIgc2l6ZSAoJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpYnVmZmVyX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKwl2cy0+YnVmZmVyX3NpemUgKz0gVklERU9fREFUQV9QQUNLRVRfU0laRTsKKworCS8qIENyZWF0ZSBidWZmZXIuICovCisJdnMtPmJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKHZzLT5idWZmZXJfc2l6ZSk7CisJaWYgKCF2cy0+YnVmZmVyKSB7CisJCWhkaG9tZXJ1bl9kZWJ1Z19wcmludGYoZGJnLCAiaGRob21lcnVuX3ZpZGVvX2NyZWF0ZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciAoJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpdnMtPmJ1ZmZlcl9zaXplKTsKKwkJZ290byBlcnJvcjsKKwl9CisJCisJLyogQ3JlYXRlIHNvY2tldC4gKi8KKwl2cy0+c29jayA9IGhkaG9tZXJ1bl9zb2NrX2NyZWF0ZV91ZHAoKTsKKwlpZiAodnMtPnNvY2sgPT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGRiZywgImhkaG9tZXJ1bl92aWRlb19jcmVhdGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBzb2NrZXRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEV4cGFuZCBzb2NrZXQgYnVmZmVyIHNpemUuICovCisJaW50IHJ4X3NpemUgPSAxMDI0ICogMTAyNDsKKwlzZXRzb2Nrb3B0KHZzLT5zb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopJnJ4X3NpemUsIHNpemVvZihyeF9zaXplKSk7CisKKwkvKiBCaW5kIHNvY2tldC4gKi8KKwlpZiAoIWhkaG9tZXJ1bl9zb2NrX2JpbmQodnMtPnNvY2ssIElOQUREUl9BTlksIGxpc3Rlbl9wb3J0LCBhbGxvd19wb3J0X3JldXNlKSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGRiZywgImhkaG9tZXJ1bl92aWRlb19jcmVhdGU6IGZhaWxlZCB0byBiaW5kIHNvY2tldCAocG9ydCAldSlcbiIsIGxpc3Rlbl9wb3J0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBTdGFydCB0aHJlYWQuICovCisJaWYgKHB0aHJlYWRfY3JlYXRlKCZ2cy0+dGhyZWFkLCBOVUxMLCAmaGRob21lcnVuX3ZpZGVvX3RocmVhZF9leGVjdXRlLCB2cykgIT0gMCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKGRiZywgImhkaG9tZXJ1bl92aWRlb19jcmVhdGU6IGZhaWxlZCB0byBzdGFydCB0aHJlYWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIHZzOworCitlcnJvcjoKKwlpZiAodnMtPnNvY2sgIT0gSERIT01FUlVOX1NPQ0tfSU5WQUxJRCkgeworCQloZGhvbWVydW5fc29ja19kZXN0cm95KHZzLT5zb2NrKTsKKwl9CisJaWYgKHZzLT5idWZmZXIpIHsKKwkJZnJlZSh2cy0+YnVmZmVyKTsKKwl9CisJZnJlZSh2cyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgaGRob21lcnVuX3ZpZGVvX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKQoreworCXZzLT50ZXJtaW5hdGUgPSBUUlVFOworCXB0aHJlYWRfam9pbih2cy0+dGhyZWFkLCBOVUxMKTsKKworCWhkaG9tZXJ1bl9zb2NrX2Rlc3Ryb3kodnMtPnNvY2spOworCWZyZWUodnMtPmJ1ZmZlcik7CisKKwlmcmVlKHZzKTsKK30KKworaGRob21lcnVuX3NvY2tfdCBoZGhvbWVydW5fdmlkZW9fZ2V0X3NvY2soc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKQoreworCXJldHVybiB2cy0+c29jazsKK30KKwordWludDE2X3QgaGRob21lcnVuX3ZpZGVvX2dldF9sb2NhbF9wb3J0KHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cykKK3sKKwl1aW50MTZfdCBwb3J0ID0gaGRob21lcnVuX3NvY2tfZ2V0c29ja25hbWVfcG9ydCh2cy0+c29jayk7CisJaWYgKHBvcnQgPT0gMCkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKHZzLT5kYmcsICJoZGhvbWVydW5fdmlkZW9fZ2V0X2xvY2FsX3BvcnQ6IGdldHNvY2tuYW1lIGZhaWxlZCAoJWQpXG4iLCBoZGhvbWVydW5fc29ja19nZXRsYXN0ZXJyb3IoKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwb3J0OworfQorCitpbnQgaGRob21lcnVuX3ZpZGVvX2pvaW5fbXVsdGljYXN0X2dyb3VwKHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cywgdWludDMyX3QgbXVsdGljYXN0X2lwLCB1aW50MzJfdCBsb2NhbF9pcCkKK3sKKwlpZiAoIWhkaG9tZXJ1bl9zb2NrX2pvaW5fbXVsdGljYXN0X2dyb3VwKHZzLT5zb2NrLCBtdWx0aWNhc3RfaXAsIGxvY2FsX2lwKSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKHZzLT5kYmcsICJoZGhvbWVydW5fdmlkZW9fam9pbl9tdWx0aWNhc3RfZ3JvdXA6IHNldHNvY2tvcHQgZmFpbGVkICglZClcbiIsIGhkaG9tZXJ1bl9zb2NrX2dldGxhc3RlcnJvcigpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAxOworfQorCit2b2lkIGhkaG9tZXJ1bl92aWRlb19sZWF2ZV9tdWx0aWNhc3RfZ3JvdXAoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzLCB1aW50MzJfdCBtdWx0aWNhc3RfaXAsIHVpbnQzMl90IGxvY2FsX2lwKQoreworCWlmICghaGRob21lcnVuX3NvY2tfbGVhdmVfbXVsdGljYXN0X2dyb3VwKHZzLT5zb2NrLCBtdWx0aWNhc3RfaXAsIGxvY2FsX2lwKSkgeworCQloZGhvbWVydW5fZGVidWdfcHJpbnRmKHZzLT5kYmcsICJoZGhvbWVydW5fdmlkZW9fbGVhdmVfbXVsdGljYXN0X2dyb3VwOiBzZXRzb2Nrb3B0IGZhaWxlZCAoJWQpXG4iLCBoZGhvbWVydW5fc29ja19nZXRsYXN0ZXJyb3IoKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZGhvbWVydW5fdmlkZW9fc3RhdHNfdHNfcGt0KHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cywgdWludDhfdCAqcHRyKQoreworCXVpbnQxNl90IHBhY2tldF9pZGVudGlmaWVyID0gKCh1aW50MTZfdCkocHRyWzFdICYgMHgxRikgPDwgOCkgfCAodWludDE2X3QpcHRyWzJdOworCWlmIChwYWNrZXRfaWRlbnRpZmllciA9PSAweDFGRkYpIHsKKwkJcmV0dXJuOworCX0KKworCWJvb2xfdCB0cmFuc3BvcnRfZXJyb3IgPSBwdHJbMV0gPj4gNzsKKwlpZiAodHJhbnNwb3J0X2Vycm9yKSB7CisJCXZzLT50cmFuc3BvcnRfZXJyb3JfY291bnQrKzsKKwkJdnMtPnNlcXVlbmNlW3BhY2tldF9pZGVudGlmaWVyXSA9IDB4RkY7CisJCXJldHVybjsKKwl9CisKKwl1aW50OF90IHNlcXVlbmNlID0gcHRyWzNdICYgMHgwRjsKKworCXVpbnQ4X3QgcHJldmlvdXNfc2VxdWVuY2UgPSB2cy0+c2VxdWVuY2VbcGFja2V0X2lkZW50aWZpZXJdOworCXZzLT5zZXF1ZW5jZVtwYWNrZXRfaWRlbnRpZmllcl0gPSBzZXF1ZW5jZTsKKworCWlmIChwcmV2aW91c19zZXF1ZW5jZSA9PSAweEZGKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHNlcXVlbmNlID09ICgocHJldmlvdXNfc2VxdWVuY2UgKyAxKSAmIDB4MEYpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKHNlcXVlbmNlID09IHByZXZpb3VzX3NlcXVlbmNlKSB7CisJCXJldHVybjsKKwl9CisKKwl2cy0+c2VxdWVuY2VfZXJyb3JfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgaGRob21lcnVuX3ZpZGVvX3BhcnNlX3J0cChzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMsIHN0cnVjdCBoZGhvbWVydW5fcGt0X3QgKnBrdCkKK3sKKwlwa3QtPnBvcyArPSAyOworCXVpbnQzMl90IHJ0cF9zZXF1ZW5jZSA9IGhkaG9tZXJ1bl9wa3RfcmVhZF91MTYocGt0KTsKKwlwa3QtPnBvcyArPSA4OworCisJdWludDMyX3QgcHJldmlvdXNfcnRwX3NlcXVlbmNlID0gdnMtPnJ0cF9zZXF1ZW5jZTsKKwl2cy0+cnRwX3NlcXVlbmNlID0gcnRwX3NlcXVlbmNlOworCisJLyogSW5pdGlhbCBjYXNlIC0gZmlyc3QgcGFja2V0IHJlY2VpdmVkLiAqLworCWlmIChwcmV2aW91c19ydHBfc2VxdWVuY2UgPT0gMHhGRkZGRkZGRikgeworCQlyZXR1cm47CisJfQorCisJLyogTm9ybWFsIGNhc2UgLSBuZXh0IHNlcXVlbmNlIG51bWJlci4gKi8KKwlpZiAocnRwX3NlcXVlbmNlID09ICgocHJldmlvdXNfcnRwX3NlcXVlbmNlICsgMSkgJiAweEZGRkYpKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBFcnJvciBjYXNlIC0gc2VxdWVuY2UgbWlzc2VkLiAqLworCXZzLT5uZXR3b3JrX2Vycm9yX2NvdW50Kys7CisKKwkvKiBSZXN0YXJ0IHBpZCBzZXF1ZW5jZSBjaGVjayBhZnRlciBwYWNrZXQgbG9zcy4gKi8KKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDAwOyBpKyspIHsKKwkJdnMtPnNlcXVlbmNlW2ldID0gMHhGRjsKKwl9Cit9CisKK3N0YXRpYyBUSFJFQURfRlVOQ19QUkVGSVggaGRob21lcnVuX3ZpZGVvX3RocmVhZF9leGVjdXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMgPSAoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKilhcmc7CisJc3RydWN0IGhkaG9tZXJ1bl9wa3RfdCBwa3RfaW5zdDsKKworCXdoaWxlICghdnMtPnRlcm1pbmF0ZSkgeworCQlzdHJ1Y3QgaGRob21lcnVuX3BrdF90ICpwa3QgPSAmcGt0X2luc3Q7CisJCWhkaG9tZXJ1bl9wa3RfcmVzZXQocGt0KTsKKworCQkvKiBSZWNlaXZlLiAqLworCQlzaXplX3QgbGVuZ3RoID0gVklERU9fUlRQX0RBVEFfUEFDS0VUX1NJWkU7CisJCWlmICghaGRob21lcnVuX3NvY2tfcmVjdih2cy0+c29jaywgcGt0LT5lbmQsICZsZW5ndGgsIDI1KSkgeworCQkJY29udGludWU7CisJCX0KKworCQlwa3QtPmVuZCArPSBsZW5ndGg7CisKKwkJaWYgKGxlbmd0aCA9PSBWSURFT19SVFBfREFUQV9QQUNLRVRfU0laRSkgeworCQkJaGRob21lcnVuX3ZpZGVvX3BhcnNlX3J0cCh2cywgcGt0KTsKKwkJCWxlbmd0aCA9IChpbnQpKHBrdC0+ZW5kIC0gcGt0LT5wb3MpOworCQl9CisKKwkJaWYgKGxlbmd0aCAhPSBWSURFT19EQVRBX1BBQ0tFVF9TSVpFKSB7CisJCQkvKiBEYXRhIHJlY2VpdmVkIGJ1dCBub3QgdmFsaWQgLSBpZ25vcmUuICovCisJCQljb250aW51ZTsKKwkJfQorCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdnMtPmxvY2spOworCisJCS8qIFN0b3JlIGluIHJpbmcgYnVmZmVyLiAqLworCQlzaXplX3QgaGVhZCA9IHZzLT5oZWFkOworCQl1aW50OF90ICpwdHIgPSB2cy0+YnVmZmVyICsgaGVhZDsKKwkJbWVtY3B5KHB0ciwgcGt0LT5wb3MsIGxlbmd0aCk7CisKKwkJLyogU3RhdHMuICovCisJCXZzLT5wYWNrZXRfY291bnQrKzsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiAwKTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiAxKTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiAyKTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiAzKTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiA0KTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiA1KTsKKwkJaGRob21lcnVuX3ZpZGVvX3N0YXRzX3RzX3BrdCh2cywgcHRyICsgVFNfUEFDS0VUX1NJWkUgKiA2KTsKKworCQkvKiBDYWxjdWxhdGUgbmV3IGhlYWQuICovCisJCWhlYWQgKz0gbGVuZ3RoOworCQlpZiAoaGVhZCA+PSB2cy0+YnVmZmVyX3NpemUpIHsKKwkJCWhlYWQgLT0gdnMtPmJ1ZmZlcl9zaXplOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdy4gKi8KKwkJaWYgKGhlYWQgPT0gdnMtPnRhaWwpIHsKKwkJCXZzLT5vdmVyZmxvd19lcnJvcl9jb3VudCsrOworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJnZzLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdnMtPmhlYWQgPSBoZWFkOworCisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2cy0+bG9jayk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3VpbnQ4X3QgKmhkaG9tZXJ1bl92aWRlb19yZWN2KHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cywgc2l6ZV90IG1heF9zaXplLCBzaXplX3QgKnBhY3R1YWxfc2l6ZSkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnZzLT5sb2NrKTsKKworCXNpemVfdCBoZWFkID0gdnMtPmhlYWQ7CisJc2l6ZV90IHRhaWwgPSB2cy0+dGFpbDsKKworCWlmICh2cy0+YWR2YW5jZSA+IDApIHsKKwkJdGFpbCArPSB2cy0+YWR2YW5jZTsKKwkJaWYgKHRhaWwgPj0gdnMtPmJ1ZmZlcl9zaXplKSB7CisJCQl0YWlsIC09IHZzLT5idWZmZXJfc2l6ZTsKKwkJfQorCQorCQl2cy0+dGFpbCA9IHRhaWw7CisJfQorCisJaWYgKGhlYWQgPT0gdGFpbCkgeworCQl2cy0+YWR2YW5jZSA9IDA7CisJCSpwYWN0dWFsX3NpemUgPSAwOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdnMtPmxvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaXplX3Qgc2l6ZSA9IChtYXhfc2l6ZSAvIFZJREVPX0RBVEFfUEFDS0VUX1NJWkUpICogVklERU9fREFUQV9QQUNLRVRfU0laRTsKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXZzLT5hZHZhbmNlID0gMDsKKwkJKnBhY3R1YWxfc2l6ZSA9IDA7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2cy0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemVfdCBhdmFpbDsKKwlpZiAoaGVhZCA+IHRhaWwpIHsKKwkJYXZhaWwgPSBoZWFkIC0gdGFpbDsKKwl9IGVsc2UgeworCQlhdmFpbCA9IHZzLT5idWZmZXJfc2l6ZSAtIHRhaWw7CisJfQorCWlmIChzaXplID4gYXZhaWwpIHsKKwkJc2l6ZSA9IGF2YWlsOworCX0KKwl2cy0+YWR2YW5jZSA9IHNpemU7CisJKnBhY3R1YWxfc2l6ZSA9IHNpemU7CisJdWludDhfdCAqcmVzdWx0ID0gdnMtPmJ1ZmZlciArIHRhaWw7CisKKwlwdGhyZWFkX211dGV4X3VubG9jaygmdnMtPmxvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaGRob21lcnVuX3ZpZGVvX2ZsdXNoKHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cykKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJnZzLT5sb2NrKTsKKworCXZzLT50YWlsID0gdnMtPmhlYWQ7CisJdnMtPmFkdmFuY2UgPSAwOworCisJdnMtPnJ0cF9zZXF1ZW5jZSA9IDB4RkZGRkZGRkY7CisKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDAwOyBpKyspIHsKKwkJdnMtPnNlcXVlbmNlW2ldID0gMHhGRjsKKwl9CisKKwl2cy0+cGFja2V0X2NvdW50ID0gMDsKKwl2cy0+dHJhbnNwb3J0X2Vycm9yX2NvdW50ID0gMDsKKwl2cy0+bmV0d29ya19lcnJvcl9jb3VudCA9IDA7CisJdnMtPnNlcXVlbmNlX2Vycm9yX2NvdW50ID0gMDsKKwl2cy0+b3ZlcmZsb3dfZXJyb3JfY291bnQgPSAwOworCisJcHRocmVhZF9tdXRleF91bmxvY2soJnZzLT5sb2NrKTsKK30KKwordm9pZCBoZGhvbWVydW5fdmlkZW9fZGVidWdfcHJpbnRfc3RhdHMoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKQoreworCXN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc3RhdHNfdCBzdGF0czsKKwloZGhvbWVydW5fdmlkZW9fZ2V0X3N0YXRzKHZzLCAmc3RhdHMpOworCisJaGRob21lcnVuX2RlYnVnX3ByaW50Zih2cy0+ZGJnLCAidmlkZW8gc29jazogcGt0PSVsdSBuZXQ9JWx1IHRlPSVsdSBtaXNzPSVsdSBkcm9wPSVsdVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc3RhdHMucGFja2V0X2NvdW50LCAodW5zaWduZWQgbG9uZylzdGF0cy5uZXR3b3JrX2Vycm9yX2NvdW50LAorCQkodW5zaWduZWQgbG9uZylzdGF0cy50cmFuc3BvcnRfZXJyb3JfY291bnQsICh1bnNpZ25lZCBsb25nKXN0YXRzLnNlcXVlbmNlX2Vycm9yX2NvdW50LAorCQkodW5zaWduZWQgbG9uZylzdGF0cy5vdmVyZmxvd19lcnJvcl9jb3VudAorCSk7Cit9CisKK3ZvaWQgaGRob21lcnVuX3ZpZGVvX2dldF9zdGF0cyhzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMsIHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc3RhdHNfdCAqc3RhdHMpCit7CisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zdGF0c190KSk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJnZzLT5sb2NrKTsKKworCXN0YXRzLT5wYWNrZXRfY291bnQgPSB2cy0+cGFja2V0X2NvdW50OworCXN0YXRzLT5uZXR3b3JrX2Vycm9yX2NvdW50ID0gdnMtPm5ldHdvcmtfZXJyb3JfY291bnQ7CisJc3RhdHMtPnRyYW5zcG9ydF9lcnJvcl9jb3VudCA9IHZzLT50cmFuc3BvcnRfZXJyb3JfY291bnQ7CisJc3RhdHMtPnNlcXVlbmNlX2Vycm9yX2NvdW50ID0gdnMtPnNlcXVlbmNlX2Vycm9yX2NvdW50OworCXN0YXRzLT5vdmVyZmxvd19lcnJvcl9jb3VudCA9IHZzLT5vdmVyZmxvd19lcnJvcl9jb3VudDsKKworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2cy0+bG9jayk7Cit9CmRpZmYgLS1naXQgYS9saWJoZGhvbWVydW4vaGRob21lcnVuX3ZpZGVvLmggYi9saWJoZGhvbWVydW4vaGRob21lcnVuX3ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTBkYzlkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmhkaG9tZXJ1bi9oZGhvbWVydW5fdmlkZW8uaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIGhkaG9tZXJ1bl92aWRlby5oCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDYgU2lsaWNvbmR1c3QgVVNBIEluYy4gPHd3dy5zaWxpY29uZHVzdC5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogCisgKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB5b3UgbWF5IGxpbmssIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIGFuIGFwcGxpY2F0aW9uIHdpdGggYQorICogcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGFuCisgKiBleGVjdXRhYmxlIGZpbGUgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoYXQgZXhlY3V0YWJsZSBmaWxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLAorICogd2l0aG91dCBhbnkgb2YgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBjbGF1c2UgNCBvZgorICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIAorICogQnkgImEgcHVibGljbHkgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSIsIHdlIG1lYW4KKyAqIGVpdGhlciB0aGUgdW5tb2RpZmllZCBMaWJyYXJ5IGFzIGRpc3RyaWJ1dGVkIGJ5IFNpbGljb25kdXN0LCBvciBhCisgKiBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5IHRoYXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgKiBjb25kaXRpb25zIGRlZmluZWQgaW4gdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdDsKKworc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zdGF0c190IHsKKwl1aW50MzJfdCBwYWNrZXRfY291bnQ7CisJdWludDMyX3QgbmV0d29ya19lcnJvcl9jb3VudDsKKwl1aW50MzJfdCB0cmFuc3BvcnRfZXJyb3JfY291bnQ7CisJdWludDMyX3Qgc2VxdWVuY2VfZXJyb3JfY291bnQ7CisJdWludDMyX3Qgb3ZlcmZsb3dfZXJyb3JfY291bnQ7Cit9OworCisjZGVmaW5lIFRTX1BBQ0tFVF9TSVpFIDE4OAorI2RlZmluZSBWSURFT19EQVRBX1BBQ0tFVF9TSVpFICgxODggKiA3KQorI2RlZmluZSBWSURFT19EQVRBX0JVRkZFUl9TSVpFXzFTICgyMDAwMDAwMCAvIDgpCisKKyNkZWZpbmUgVklERU9fUlRQX0RBVEFfUEFDS0VUX1NJWkUgKCgxODggKiA3KSArIDEyKQorCisvKgorICogQ3JlYXRlIGEgdmlkZW8vZGF0YSBzb2NrZXQuCisgKgorICogdWludDE2X3QgbGlzdGVuX3BvcnQ6IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi4gU2V0IHRvIDAgdG8gYXV0by1zZWxlY3QuCisgKiBzaXplX3QgYnVmZmVyX3NpemU6IFNpemUgb2YgcmVjZWl2ZSBidWZmZXIuIEZvciAxIHNlY29uZCBvZiBidWZmZXIgdXNlIFZJREVPX0RBVEFfQlVGRkVSX1NJWkVfMVMuIAorICogc3RydWN0IGhkaG9tZXJ1bl9kZWJ1Z190ICpkYmc6IFBvaW50ZXIgdG8gZGVidWcgbG9nZ2luZyBvYmplY3QuIE1heSBiZSBOVUxMLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRyb2wgc29ja2V0LgorICoKKyAqIFdoZW4gbm8gbG9uZ2VyIG5lZWRlZCwgdGhlIHNvY2tldCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IGNhbGxpbmcgaGRob21lcnVuX2NvbnRyb2xfZGVzdHJveS4KKyAqLworZXh0ZXJuIExJQlRZUEUgc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKmhkaG9tZXJ1bl92aWRlb19jcmVhdGUodWludDE2X3QgbGlzdGVuX3BvcnQsIGJvb2xfdCBhbGxvd19wb3J0X3JldXNlLCBzaXplX3QgYnVmZmVyX3NpemUsIHN0cnVjdCBoZGhvbWVydW5fZGVidWdfdCAqZGJnKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3ZpZGVvX2Rlc3Ryb3koc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKTsKKworLyoKKyAqIEdldCB0aGUgcG9ydCB0aGUgc29ja2V0IGlzIGxpc3RlbmluZyBvbi4KKyAqCisgKiBSZXR1cm5zIDE2LWJpdCBwb3J0IHdpdGggbmF0aXZlIGVuZGlhbm5lc3MsIG9yIDAgb24gZXJyb3IuCisgKi8KK2V4dGVybiBMSUJUWVBFIHVpbnQxNl90IGhkaG9tZXJ1bl92aWRlb19nZXRfbG9jYWxfcG9ydChzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMpOworCisvKgorICogSm9pbi9sZWF2ZSBtdWx0aWNhc3QgZ3JvdXAuCisgKi8KK2V4dGVybiBMSUJUWVBFIGludCBoZGhvbWVydW5fdmlkZW9fam9pbl9tdWx0aWNhc3RfZ3JvdXAoc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzLCB1aW50MzJfdCBtdWx0aWNhc3RfaXAsIHVpbnQzMl90IGxvY2FsX2lwKTsKK2V4dGVybiBMSUJUWVBFIHZvaWQgaGRob21lcnVuX3ZpZGVvX2xlYXZlX211bHRpY2FzdF9ncm91cChzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMsIHVpbnQzMl90IG11bHRpY2FzdF9pcCwgdWludDMyX3QgbG9jYWxfaXApOworCisvKgorICogUmVhZCBkYXRhIGZyb20gYnVmZmVyLgorICoKKyAqIHNpemVfdCBtYXhfc2l6ZTogVGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgdG8gYmUgcmV0dXJuZWQuCisgKiBzaXplX3QgKnBhY3R1YWxfc2l6ZTogVGhlIGNhbGxlci1zdXBwbGllZCBwYWN0dWFsX3NpemUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIGFtb3VudAorICoJCW9mIGRhdGEgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEsIG9yIE5VTEwgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUuCisgKiBUaGUgZGF0YSB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCBhbm90aGVyIGNhbGwgdG8gaGRob21lcnVuX3ZpZGVvX3JlY3YuCisgKgorICogVGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkIHdpbGwgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgVklERU9fREFUQV9QQUNLRVRfU0laRSAoMTMxNikuCisgKiBBdHRlbXB0aW5nIHRvIHJlYWQgYSBzaW5nbGUgVFMgZnJhbWUgKDE4OCBieXRlcykgd2lsbCBub3QgcmV0dXJuIGRhdGEgYXMgaXQgaXMgbGVzcyB0aGFuCisgKiB0aGUgbWluaW11bSBzaXplLgorICoKKyAqIFRoZSBidWZmZXIgaXMgaW1wbGVtZW50ZWQgYXMgYSByaW5nIGJ1ZmZlci4gSXQgaXMgcG9zc2libGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGEgc21hbGwKKyAqIGFtb3VudCBvZiBkYXRhIHdoZW4gbW9yZSBpcyBhdmFpbGFibGUgZHVlIHRvIHRoZSB3cmFwLWFyb3VuZCBjYXNlLgorICovCitleHRlcm4gTElCVFlQRSB1aW50OF90ICpoZGhvbWVydW5fdmlkZW9fcmVjdihzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMsIHNpemVfdCBtYXhfc2l6ZSwgc2l6ZV90ICpwYWN0dWFsX3NpemUpOworCisvKgorICogRmx1c2ggdGhlIGJ1ZmZlci4KKyAqLworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fdmlkZW9fZmx1c2goc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKTsKKworLyoKKyAqIERlYnVnIHByaW50IGludGVybmFsIHN0YXRzLgorICovCitleHRlcm4gTElCVFlQRSB2b2lkIGhkaG9tZXJ1bl92aWRlb19kZWJ1Z19wcmludF9zdGF0cyhzdHJ1Y3QgaGRob21lcnVuX3ZpZGVvX3NvY2tfdCAqdnMpOworZXh0ZXJuIExJQlRZUEUgdm9pZCBoZGhvbWVydW5fdmlkZW9fZ2V0X3N0YXRzKHN0cnVjdCBoZGhvbWVydW5fdmlkZW9fc29ja190ICp2cywgc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zdGF0c190ICpzdGF0cyk7CisKKy8qCisgKiBJbnRlcm5hbCB1c2Ugb25seS4KKyAqLworZXh0ZXJuIExJQlRZUEUgaGRob21lcnVuX3NvY2tfdCBoZGhvbWVydW5fdmlkZW9fZ2V0X3NvY2soc3RydWN0IGhkaG9tZXJ1bl92aWRlb19zb2NrX3QgKnZzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmhkaG9tZXJ1bi9sZ3BsLnR4dCBiL2xpYmhkaG9tZXJ1bi9sZ3BsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYzhhNWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliaGRob21lcnVuL2xncGwudHh0CkBAIC0wLDAgKzEsMTY1IEBACisJCSAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisKKyAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UsIHN1cHBsZW1lbnRlZCBieSB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBsaXN0ZWQgYmVsb3cuCisKKyAgMC4gQWRkaXRpb25hbCBEZWZpbml0aW9ucy4gCisKKyAgQXMgdXNlZCBoZXJlaW4sICJ0aGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgIkdOVSBHUEwiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiVGhlIExpYnJhcnkiIHJlZmVycyB0byBhIGNvdmVyZWQgd29yayBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UsCitvdGhlciB0aGFuIGFuIEFwcGxpY2F0aW9uIG9yIGEgQ29tYmluZWQgV29yayBhcyBkZWZpbmVkIGJlbG93LgorCisgIEFuICJBcHBsaWNhdGlvbiIgaXMgYW55IHdvcmsgdGhhdCBtYWtlcyB1c2Ugb2YgYW4gaW50ZXJmYWNlIHByb3ZpZGVkCitieSB0aGUgTGlicmFyeSwgYnV0IHdoaWNoIGlzIG5vdCBvdGhlcndpc2UgYmFzZWQgb24gdGhlIExpYnJhcnkuCitEZWZpbmluZyBhIHN1YmNsYXNzIG9mIGEgY2xhc3MgZGVmaW5lZCBieSB0aGUgTGlicmFyeSBpcyBkZWVtZWQgYSBtb2RlCitvZiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIExpYnJhcnkuCisKKyAgQSAiQ29tYmluZWQgV29yayIgaXMgYSB3b3JrIHByb2R1Y2VkIGJ5IGNvbWJpbmluZyBvciBsaW5raW5nIGFuCitBcHBsaWNhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5LiAgVGhlIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgTGlicmFyeQord2l0aCB3aGljaCB0aGUgQ29tYmluZWQgV29yayB3YXMgbWFkZSBpcyBhbHNvIGNhbGxlZCB0aGUgIkxpbmtlZAorVmVyc2lvbiIuCisKKyAgVGhlICJNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSBDb21iaW5lZCBXb3JrIG1lYW5zIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIHRoZSBDb21iaW5lZCBXb3JrLCBleGNsdWRpbmcgYW55IHNvdXJjZSBjb2RlCitmb3IgcG9ydGlvbnMgb2YgdGhlIENvbWJpbmVkIFdvcmsgdGhhdCwgY29uc2lkZXJlZCBpbiBpc29sYXRpb24sIGFyZQorYmFzZWQgb24gdGhlIEFwcGxpY2F0aW9uLCBhbmQgbm90IG9uIHRoZSBMaW5rZWQgVmVyc2lvbi4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSIgZm9yIGEgQ29tYmluZWQgV29yayBtZWFucyB0aGUKK29iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSBmb3IgdGhlIEFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgYW55IGRhdGEKK2FuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IgcmVwcm9kdWNpbmcgdGhlIENvbWJpbmVkIFdvcmsgZnJvbSB0aGUKK0FwcGxpY2F0aW9uLCBidXQgZXhjbHVkaW5nIHRoZSBTeXN0ZW0gTGlicmFyaWVzIG9mIHRoZSBDb21iaW5lZCBXb3JrLgorCisgIDEuIEV4Y2VwdGlvbiB0byBTZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgdW5kZXIgc2VjdGlvbnMgMyBhbmQgNCBvZiB0aGlzIExpY2Vuc2UKK3dpdGhvdXQgYmVpbmcgYm91bmQgYnkgc2VjdGlvbiAzIG9mIHRoZSBHTlUgR1BMLgorCisgIDIuIENvbnZleWluZyBNb2RpZmllZCBWZXJzaW9ucy4KKworICBJZiB5b3UgbW9kaWZ5IGEgY29weSBvZiB0aGUgTGlicmFyeSwgYW5kLCBpbiB5b3VyIG1vZGlmaWNhdGlvbnMsIGEKK2ZhY2lsaXR5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gQXBwbGljYXRpb24KK3RoYXQgdXNlcyB0aGUgZmFjaWxpdHkgKG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlCitmYWNpbGl0eSBpcyBpbnZva2VkKSwgdGhlbiB5b3UgbWF5IGNvbnZleSBhIGNvcHkgb2YgdGhlIG1vZGlmaWVkCit2ZXJzaW9uOgorCisgICBhKSB1bmRlciB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgeW91IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0bworICAgZW5zdXJlIHRoYXQsIGluIHRoZSBldmVudCBhbiBBcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgdGhlCisgICBmdW5jdGlvbiBvciBkYXRhLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcworICAgd2hhdGV2ZXIgcGFydCBvZiBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwsIG9yCisKKyAgIGIpIHVuZGVyIHRoZSBHTlUgR1BMLCB3aXRoIG5vbmUgb2YgdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSBhcHBsaWNhYmxlIHRvIHRoYXQgY29weS4KKworICAzLiBPYmplY3QgQ29kZSBJbmNvcnBvcmF0aW5nIE1hdGVyaWFsIGZyb20gTGlicmFyeSBIZWFkZXIgRmlsZXMuCisKKyAgVGhlIG9iamVjdCBjb2RlIGZvcm0gb2YgYW4gQXBwbGljYXRpb24gbWF5IGluY29ycG9yYXRlIG1hdGVyaWFsIGZyb20KK2EgaGVhZGVyIGZpbGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LiAgWW91IG1heSBjb252ZXkgc3VjaCBvYmplY3QKK2NvZGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQsIGlmIHRoZSBpbmNvcnBvcmF0ZWQKK21hdGVyaWFsIGlzIG5vdCBsaW1pdGVkIHRvIG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhIHN0cnVjdHVyZQorbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBvciBzbWFsbCBtYWNyb3MsIGlubGluZSBmdW5jdGlvbnMgYW5kIHRlbXBsYXRlcworKHRlbiBvciBmZXdlciBsaW5lcyBpbiBsZW5ndGgpLCB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOgorCisgICBhKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIG9iamVjdCBjb2RlIHRoYXQgdGhlCisgICBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgYikgQWNjb21wYW55IHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlCisgICBkb2N1bWVudC4KKworICA0LiBDb21iaW5lZCBXb3Jrcy4KKworICBZb3UgbWF5IGNvbnZleSBhIENvbWJpbmVkIFdvcmsgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UgdGhhdCwKK3Rha2VuIHRvZ2V0aGVyLCBlZmZlY3RpdmVseSBkbyBub3QgcmVzdHJpY3QgbW9kaWZpY2F0aW9uIG9mIHRoZQorcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkgY29udGFpbmVkIGluIHRoZSBDb21iaW5lZCBXb3JrIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucywgaWYgeW91IGFsc28gZG8gZWFjaCBvZgordGhlIGZvbGxvd2luZzoKKworICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQKKyAgIHRoZSBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgYikgQWNjb21wYW55IHRoZSBDb21iaW5lZCBXb3JrIHdpdGggYSBjb3B5IG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UKKyAgIGRvY3VtZW50LgorCisgICBjKSBGb3IgYSBDb21iaW5lZCBXb3JrIHRoYXQgZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMgZHVyaW5nCisgICBleGVjdXRpb24sIGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nCisgICB0aGVzZSBub3RpY2VzLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIGRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUKKyAgIGNvcGllcyBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlIGRvY3VtZW50LgorCisgICBkKSBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgIDApIENvbnZleSB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworICAgICAgIExpY2Vuc2UsIGFuZCB0aGUgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbiBDb2RlIGluIGEgZm9ybQorICAgICAgIHN1aXRhYmxlIGZvciwgYW5kIHVuZGVyIHRlcm1zIHRoYXQgcGVybWl0LCB0aGUgdXNlciB0bworICAgICAgIHJlY29tYmluZSBvciByZWxpbmsgdGhlIEFwcGxpY2F0aW9uIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgICAgICAgdGhlIExpbmtlZCBWZXJzaW9uIHRvIHByb2R1Y2UgYSBtb2RpZmllZCBDb21iaW5lZCBXb3JrLCBpbiB0aGUKKyAgICAgICBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTCBmb3IgY29udmV5aW5nCisgICAgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuCisKKyAgICAgICAxKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKGEpIHVzZXMgYXQgcnVuIHRpbWUKKyAgICAgICBhIGNvcHkgb2YgdGhlIExpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIKKyAgICAgICBzeXN0ZW0sIGFuZCAoYikgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCisgICAgICAgb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSBMaW5rZWQKKyAgICAgICBWZXJzaW9uLiAKKworICAgZSkgUHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24sIGJ1dCBvbmx5IGlmIHlvdSB3b3VsZCBvdGhlcndpc2UKKyAgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbiB1bmRlciBzZWN0aW9uIDYgb2YgdGhlCisgICBHTlUgR1BMLCBhbmQgb25seSB0byB0aGUgZXh0ZW50IHRoYXQgc3VjaCBpbmZvcm1hdGlvbiBpcworICAgbmVjZXNzYXJ5IHRvIGluc3RhbGwgYW5kIGV4ZWN1dGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZQorICAgQ29tYmluZWQgV29yayBwcm9kdWNlZCBieSByZWNvbWJpbmluZyBvciByZWxpbmtpbmcgdGhlCisgICBBcHBsaWNhdGlvbiB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlua2VkIFZlcnNpb24uIChJZgorICAgeW91IHVzZSBvcHRpb24gNGQwLCB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIG11c3QgYWNjb21wYW55CisgICB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbmQgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbgorICAgQ29kZS4gSWYgeW91IHVzZSBvcHRpb24gNGQxLCB5b3UgbXVzdCBwcm92aWRlIHRoZSBJbnN0YWxsYXRpb24KKyAgIEluZm9ybWF0aW9uIGluIHRoZSBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTAorICAgZm9yIGNvbnZleWluZyBDb3JyZXNwb25kaW5nIFNvdXJjZS4pCisKKyAgNS4gQ29tYmluZWQgTGlicmFyaWVzLgorCisgIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZSBieSBzaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIHRoYXQgYXJlIG5vdCBBcHBsaWNhdGlvbnMgYW5kIGFyZSBub3QgY292ZXJlZCBieSB0aGlzCitMaWNlbnNlLCBhbmQgY29udmV5IHN1Y2ggYSBjb21iaW5lZCBsaWJyYXJ5IHVuZGVyIHRlcm1zIG9mIHlvdXIKK2Nob2ljZSwgaWYgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKKworICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsgYmFzZWQKKyAgIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcywKKyAgIGNvbnZleWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IHRoYXQgcGFydCBvZiBpdAorICAgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDYuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcKK3ZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heQorZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlCitMaWJyYXJ5IGFzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbgorb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iCithcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHB1Ymxpc2hlZCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIExpYnJhcnkgYXMgeW91CityZWNlaXZlZCBpdCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgSWYgdGhlIExpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZQord2hldGhlciBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBzaGFsbAorYXBwbHksIHRoYXQgcHJveHkncyBwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYW55IHZlcnNpb24gaXMKK3Blcm1hbmVudCBhdXRob3JpemF0aW9uIGZvciB5b3UgdG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlCitMaWJyYXJ5Lgo=